none
Wie kann man aus einer dynamisch ermittelten Anzahl n (int) entsprechend viele Spalten in einer Variablen erzeugen? RRS feed

  • Frage

  • Hallo zusammen,

    ich habe eine Tabelle mit u.a. den Spalten [A Produkt], [A Nummer], [B Produkt], [B Nummer] und ermittele die Anzahl der gemeinsamen Produkte zu einer Nummer mit folgendem Statement:

    Select Max(d.Anzahl) Maximum 
    FROM 
    (
    	select c.p, c.anzahl 
    	FROM 
    	(
    		Select b.P, COUNT(*) as Anzahl 
    		FROM 
    		(
    			Select a.P, a.H 
    			FROM 
    			(
    				Select [A Produkt] as P, [A Nummer] as H 
    				from TestTable
    				WHERE [A Produkt] <> N'' AND [A Nummer] <> N'' 
    				Union 
    				Select [B Produkt] as P, [B Nummer] as H 
    				from TestTable
    				WHERE [B Produkt] <> N'' AND [B Nummer] <> N''
    			) a 
    			GROUP by a.P,a.H
    		) b 
    		GROUP BY b.P
    	) c
    	where c.Anzahl>1 
    	group by c.P,c.Anzahl
     ) d

    Dies funktioniert auch tadellos.

    Nun möchte ich aus der ermittelten Anzahl für eine Pivotierung eine entsprechende Anzahl an Spalten generieren, also ist Maximum z.B. "3" sollen daraus die Spalten [Produkt 1], [Produkt 2], [Produkt 3] generiert werden.

    Gibt es dafür in T-SQL
    DECLARE @cols NVARCHAR (max)
    eine Schleife wie in c#:
    For (int i = 0, i < 3, i++)
    {
       @cols = @cols + N'[Produkt ' + (i +1) + ']'
    }

    ???

    Gruß

    Jürgen

    Montag, 8. Oktober 2018 06:54

Alle Antworten

  • Vielleicht schaffst du es mit dynamischen SQL's (execute-Anweisung).
    Arrays werden von SQL-Server nicht unterstützt.
    Montag, 8. Oktober 2018 07:30
  • Hallo,

    danke für die Rückmeldung. Arrays sollen ja nicht generiert werden.

    Ich habe zwar eine Lösung gefunden:

    DECLARE @i int,
            @cols NVARCHAR(max)
            @max int
    
    Set @i = 0
    SET @cols = N''
    WHILE @i < @max
    BEGIN
      SET @i = @i + 1
      SET @cols = @cols + '[' + RTRIM(CAST(@i as char(3))) + '],'
    
    END
    
    SET @cols = SUBSTRING(@cols,1,LEN(@cols) - 1 )

    Leider kann ich aber für den PIVOT die Spaltenbezeichnungen nicht ändern, bzw. umbenennen.

    Naja egal. Dann mache ich das eben in der VIEW.

    Gruß

    Jürgen

    Montag, 8. Oktober 2018 12:28