none
SQL 2008 R2: Pivot ohne Aggregatfunktion ? RRS feed

  • Frage

  • Hallo zusammen,

    schon tausendmal gefragt. Ich finde aber keine Lösung, die auf mein Problem
    trifft. Welches da ist: Ich habe Messwerte, die ich im Excel 2010 Liniendiagramm darstellen will. Aggregatfunktionen verbieten sich aber, siehe unten.

    Nebenbedingungen:
    - es können beliebig viele Messtellen werden (muss also flexibel sein, keine Aufzählungen)
    - es gibt doppelte "Keys" (Zeile 5 und 6). Aus diesem Grund darf es keine Aggregatfunktion sein, Min(), Max(), Avg(), Sum() usw. ist alles unbrauchbar.
    - es gibt nicht zu jedem Datum alle Werte (Zeile 9)
    - Kein Pivot-Diagramm, weil das keine äquidistante Zeit kann, ich muss mich also um die Aufbereitung selbst kümmern. Deswegen der ganze Aufwand


    IST: (stark vereinfacht, die erste Spalte nur zur Verdeutlichung)

    Record  Datum       Messst  Wert
    1       15.01.1997  M1      10
    2       07.02.1997  M1      11
    3       13.03.1997  M1      12
    4       15.01.1997  M2      13
    5       07.02.1997  M2      14
    6       07.02.1997  M2      14,5
    7       13.03.1997  M2      15
    8       15.01.1997  M3      16
    9       14.03.1997  M3      18


    SOLL:

    Datum       M1  M2  M3
    15.01.1997  10  13  16
    07.02.1997  11  14  
    07.02.1997      14,5    
    13.03.1997  12  15  
    14.03.1997          18

    Wobei es dem Diagramm beim 7.2.97 egal ist, ob die 11 bei der 14 oder der
    14,5 steht. Aber Aggregatfunktionen liefern dafür das falsche Ergebnis.

    Das Diagramm als Beispiel:

    Diagramm

    Zum Testen:

    create table #temp( Datum datetime, Messstelle varchar(5), Wert float);
    set dateformat dmy;
    insert into #temp values ('15.01.1997', 'M1', 10);
    insert into #temp values ('07.02.1997', 'M1', 11);
    insert into #temp values ('13.03.1997', 'M1', 12);
    insert into #temp values ('15.01.1997', 'M2', 13);
    insert into #temp values ('07.02.1997', 'M2', 14);
    insert into #temp values ('07.02.1997', 'M2', 14.5);
    insert into #temp values ('13.03.1997', 'M2', 15);
    insert into #temp values ('15.01.1997', 'M3', 16);
    insert into #temp values ('14.03.1997', 'M3', 18);
    select * from #temp

    Wie komme ich von da zum Soll (auch wenn es 200 Messstellen sind, deren Namen ich noch nicht weiß) ?


    Vielen Dank
    Karsten

    Montag, 8. Oktober 2012 19:13

Antworten

  • hmm, z.B.

    WITH Data AS
    	(
    		SELECT	*,
    				ROW_NUMBER() OVER (PARTITION BY Datum, Messstelle ORDER BY Wert) AS RN
    		FROM	#temp
    	)
    SELECT	Datum,
    		M1,
    		M2,
    		M3
    FROM	Data
    PIVOT	( MIN(Wert) FOR Messstelle IN (M1,M2,M3)) P;
    

    Und das ganze mittels dynamischem SQL. Lies aber vorher Erlands Artikel darüber: The Curse and Blessings of Dynamic SQL.
    • Als Antwort markiert Karsten P Montag, 8. Oktober 2012 21:02
    Montag, 8. Oktober 2012 20:30

Alle Antworten

  • hmm, z.B.

    WITH Data AS
    	(
    		SELECT	*,
    				ROW_NUMBER() OVER (PARTITION BY Datum, Messstelle ORDER BY Wert) AS RN
    		FROM	#temp
    	)
    SELECT	Datum,
    		M1,
    		M2,
    		M3
    FROM	Data
    PIVOT	( MIN(Wert) FOR Messstelle IN (M1,M2,M3)) P;
    

    Und das ganze mittels dynamischem SQL. Lies aber vorher Erlands Artikel darüber: The Curse and Blessings of Dynamic SQL.
    • Als Antwort markiert Karsten P Montag, 8. Oktober 2012 21:02
    Montag, 8. Oktober 2012 20:30
  • Sowas hab ich mir gedacht. Ich hatte nur gehofft, das ich drumrum komme.

    Vielen Dank
    Karsten

    Montag, 8. Oktober 2012 21:01