Spaltenwerte als Spalte ausgeben

ny_unity

SQL-Guru
Beiträge
201
Hallo,

die Überschrift ist nicht ganz richtig, ich weiß aber nicht wie ich es besser schreiben soll, ich versuche mal zu erklären was ich möchte....

Ich habe eine Tabelle mit einer Spalte "sprache". Aufgrund dieser Spalte möchte ich Auswertungen treffen. Es kann aber immer wieder eine neue Sprache hinzukommen, daher möchte ich die Spalten nicht festlegen sondern hoffe es geht irgendwie über T-SQL.

Am Ende möchte ich beispielsweise folgende Spalten haben:
Zeitraum - deutsch - englisch - spanisch - franz -
2019/06 - 200 - 5 - 3 - 17

Ich hoffe ich konnte es etwas erklären und ihr könnt euch denken was ich möchte.

Ist das realisierbar?

MfG

Erik
 
Werbung:
so ungefähr. Ich habe hier im Forum schon mal ein HowTo geschrieben, wie man dies macht. MSSQL-Server hat aber IMHO auch eine Pivot-Funktion, Google kennt die sicherlich.
 
Wie wärs mit einer richtigen Spalte Sprache die du mit den anderen Daten entsprechend pro Zeile mit abspeicherst? Dann kannst du den Inhalt immer entsprechend erweitern
 
google half mir, ich habs übers pivotieren hinbekommen...

Lösung:
Code:
CREATE TABLE temp
(
    zeitraum nvarchar(max),
    sprache nvarchar(max),
    anzahl int
)

INSERT INTO temp (zeitraum, sprache, anzahl)
    SELECT CONVERT(varchar,DATEPART(YEAR,Anlagedatum)) + '/' + CASE WHEN DATEPART(MONTH,Anlagedatum) < 10 THEN '0' ELSE '' END + CONVERT(varchar, DATEPART(MONTH,Anlagedatum)), sprache, COUNT(bewerber_id) 
    FROM meinetabelle
    GROUP BY anlagedatum, sprache

DECLARE @cols    AS NVARCHAR(MAX),
        @query  AS NVARCHAR(MAX);

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.sprache) 
            FROM temp c
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT zeitraum, ' + @cols + ' from 
            (
                select zeitraum
                    , anzahl
                    , sprache
                from temp
           ) x
            pivot 
            (
                 sum(anzahl)
                for sprache in (' + @cols + ')
            ) p '

execute(@query)

drop table temp

Danke, Stichwort Pivot half mir.
 
ein Problem habe ich doch noch...

Code:
DECLARE @cols    AS NVARCHAR(MAX),
        @query  AS NVARCHAR(MAX);
DECLARE @PARAMETER table (zeitraum nvarchar(max), sprache nvarchar(max), anzahl int);

INSERT INTO @PARAMETER (zeitraum, sprache, anzahl)
    SELECT CONVERT(varchar,DATEPART(YEAR,Anlagedatum)) + '/' + CASE WHEN DATEPART(MONTH,Anlagedatum) < 10 THEN '0' ELSE '' END + CONVERT(varchar, DATEPART(MONTH,Anlagedatum)), sprache, COUNT(bewerber_id) 
    FROM meinetabelle
    GROUP BY anlagedatum, sprache;
     
SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.sprache) 
            FROM @PARAMETER c
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'');


SELECT zeitraum, @cols from 
            (
                select zeitraum
                    , anzahl
                    , sprache
                from @PARAMETER
           ) x
            pivot 
            (
                 sum(anzahl)
                for sprache IN (@cols)
            ) p;

SELECT * FROM @PARAMETER
Ich wöllte gern mit der parametertabelle weiter arbeiten, bekomme ich aber Probleme mit der Syntax von @cols bei
Code:
pivot 
            (
                 sum(anzahl)
                for sprache IN (@cols)
            ) p;
Meldung: Erwartet '.', ID oder QUOTED_ID.

Was soll der Fehler sein? Der Wert von @cols ist [cz],[de],[en],[hu],[pl],[ro],[sk]
 
Werbung:
Leider akzeptiert MSSQL an dieser Stelle im Pivot keine Variable, die Spaltenliste dort ist eben Bestandteil des Querys. Du kannst auch kein
Code:
DECLARE @v VARCHAR(100) = 'tabellenname'
SELECT * FROM @v
machen. Dazu müsste man erst die Variable auflösen und das Resultat mit EXEC() ausführen. Das nennt sich dann dynamic SQL, hat aber so seine Tücken.
Code:
DECLARE @v VARCHAR(100) = 'tabellenname',
DECLARE @query VARCHAR(100) = 'SELECT * FROM '
SET @query = @query + @v
EXEC(@query)
 
Zurück
Oben