Benutzer mit den meisten Antworten
SQL 2008 R2: Pivot ohne Aggregatfunktion ?

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:
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
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
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