none
Verständnisfrage für Pivot RRS feed

  • Frage

  • Hallo an alle,

    ich habe stets wiederkehrendes Problem.

    Tabelle:

    Zaehler_NR       |       Wert  |

    1                              100

    2                              200

    3                              300

    Ich hätte aber gern folgende "Tabelle" vorliegen.

    Tabelle:

    1     |     2    |       3

    100        200        300

    Ich habe irgendwo mal aufgeschnappt das man dies mit Pivot machen kann. Bisher mache ich dies umständlich über CASE.

    Jedoch bekomme ich das Pivot nicht so recht zum laufen.

     SELECT [1],[2] 
      FROM
      (SELECT Zaehler_Nr, Wert 
    
      FROM Tabele ) 
    	as Sourcetable
    	PIVOT 
    	(
    
    	AVG(Wert)
    	FOR Zaehler_Nr in ( [1],[2])
    	) as PivotTable;

    kann mir bitte jemand helfen?

    Donnerstag, 20. Juli 2017 07:27

Alle Antworten

  • Und wo genau ist das Problem, die Abfrage geht doch

    ;WITH testDaten AS
        (SELECT 1 AS Zaehler_Nr, 100 AS Wert
         UNION ALL SELECT 2, 200
         UNION ALL SELECT 3, 300)
    
    
    SELECT [1],[2], [3]
    FROM
      (SELECT Zaehler_Nr, Wert 
       FROM testDaten
      )
      as Sourcetable
      PIVOT 
    	(AVG(Wert)
    	 FOR Zaehler_Nr in ( [1],[2], [3])
    	) as PivotTable;

    Wobei AVG vielleicht nicht die richtige Aggregation ist.


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Donnerstag, 20. Juli 2017 08:08
  • Hallo Olaf, danke für deine Hilfe. Ich habe bei den Testdaten auf einstellige Integer Werte gesetzt. In der Realität, hier in der Tabelle, gibt es vor allem Zahlen die zweistellig sind. Ist ein Iteger Wert zweistellig habe ich ein NULL in der betreffenden Spalte. Warum ist das so?

    WITH testDaten AS
        (SELECT 10 AS Zaehler_Nr, 100 AS Wert
         UNION ALL SELECT 2, 200.45
         UNION ALL SELECT 3, 300.55)
    
    
    SELECT [1],[2], [3]
    FROM
      (SELECT Zaehler_Nr, Wert 
       FROM testDaten
      )
      as Sourcetable
      PIVOT 
    	(AVG(Wert)
    	 FOR Zaehler_Nr in ( [1],[2], [3])
    	) as PivotTable;

    Resultset:

    1                2              3
    NULL 200.450000 300.550000

    Donnerstag, 20. Juli 2017 09:00
  • In Deinem Beispiel passen die Zaehler_Nr nicht zum Pivot.

    Was soll der Wert 10 ganz oben?


    Einen schönen Tag noch, Christoph -- Data Platform MVP - http://www.insidesql.org/blogs/cmu

    Donnerstag, 20. Juli 2017 09:26
    Beantworter
  • Hallo Christoph, der Wert 10 ist die Zaehler_Nr. Sprich Zaehler_Nr = 10. Kannst du mir deine Aussage, das der Wert nicht zum Pivot passt, noch genauer erklären? Ich verstehe das leider noch nicht.
    Donnerstag, 20. Juli 2017 09:38
  • Okay! Oben schreibst du 10, aber unten schreibst Du wieder 1. So geht es:

    WITH testDaten AS
        (SELECT 10 AS Zaehler_Nr, 100.00 AS Wert
         UNION ALL 
    	 SELECT 20, 200.45
         UNION ALL 
    	 SELECT 30, 300.55)
    
    SELECT [10], [20], [30]
    FROM
      (SELECT Zaehler_Nr, Wert 
       FROM testDaten
      )
      as Sourcetable
      PIVOT 
    	(AVG(Wert)
    	 FOR Zaehler_Nr in ( [10] ,[20], [30])
    	) as PivotTable;

    Hier mal ein Ansatz, wie es komplett dynamisch geht.

    DECLARE @cols NVARCHAR(1000), 
    		@query VARCHAR(8000);
    
    With Daten as
    (
        (SELECT 10 AS Zaehler_Nr, 100.00 AS Wert
         UNION ALL 
    	 SELECT 20, 200.45
         UNION ALL 
    	 SELECT 30, 300.55)
    )
    Select Zaehler_Nr, Wert
    into #TestDaten
    from Daten;
    
    SELECT    @cols = STUFF(( SELECT '],[' + cast(Zaehler_Nr as varchar(5))
    							FROM        (SELECT DISTINCT Zaehler_Nr
    							FROM        #TestDaten ) a
    							FOR XML PATH('')
                              ), 1, 2, '') + ']';
    
    -- Select @cols;
    
    SET @query = N'SELECT '+
    cast(@cols    as varchar(1000)) +'
    FROM #TestDaten p
    PIVOT (
    Avg(Wert)
    FOR Zaehler_Nr
    IN ('+
    cast(@cols    as varchar(1000)) +' )
    ) as x
    ;'
    
    -- Select @query;
    
    EXECUTE(@query);
    go
    DROP TABLE #TestDaten;
    Siehe auch Dynamisches Pivot


    Einen schönen Tag noch, Christoph -- Data Platform MVP - http://www.insidesql.org/blogs/cmu

    Donnerstag, 20. Juli 2017 09:45
    Beantworter