Group By auf Mehrere Spalten

Steven85

Benutzer
Beiträge
12
Folgende Ausgangstabellen:

ID-Raum
1 Wohnen
2 Bad
3 Büro

ID-IDRaum-Datum-Temp
1 1 01.10.13 21,0
2 2 02.10.13 20,0
3 3 03.10.13 23,2
4 1 04.10.13 22,2
5 3 05.10.13 24,9
6 1 06.10.13 19,0
7 2 07.10.13 14,3

Ich möchte jetzt gerne folgende Ausgabe:

Select Datum, Raum, Max(Temp)....

Datum-Raum-Temp
04.10.13 Büro 22,2
02.10.13 Bad 20,0
03.10.13 Wohnen 23,2

Also quasi alle Max Temperaturen jedes Raums und an welchem Datum dieses war.
Bekomme nicht die korrekte Group By Klausel zusammen.
 
Werbung:

ukulele

Datenbank-Guru
Beiträge
4.702
Dein Problem wird das Datum sein das entweder aggregiert werden muss oder im GROUP BY stehen soll. Hier mal ein Ansatz wie das Datum "nachträglich" hinzugefügt werden kann:
Code:
SELECT    (    SELECT    max(t2.Datum)
            FROM    tabelle t2
            WHERE    t2.Raum = t1.Raum
            AND        t2.Temp = t1.Temp ) AS Datum,
        t1.Raum,
        t1.Temp
FROM    (    SELECT    Raum,
                    max(Temp) AS Temp
            FROM    tabelle
            GROUP BY Raum ) t1
 

ukulele

Datenbank-Guru
Beiträge
4.702
max(Datum) weil theoretisch die maximale Temperatur an 2 Tagen erreicht werden kann und die Unterabfrage nie mehr als einen Wert zurück liefern kann. Wenn du dann mehrere Datumswerte haben willst müsste man anders vorgehen. Besonders fies wirds wenn diese Datumswerte in einer Spalte aufgelistet werden sollen, mehrere Zeilen kann man leicht mit einem Join realisieren.

t1.temp gibt es und das Datum das im Subselect abgefragt wird muss natürlich auch zu dem Temp Wert passen, daher die Einschränkung.
Code:
SELECT    *
FROM    (    SELECT    Raum,
                    max(Temp) AS Temp
            FROM    tabelle
            GROUP BY Raum ) t1
...liefert dir erstmal nur zu jedem Raum die maximale Temperatur, ohne Datum.
 

ukulele

Datenbank-Guru
Beiträge
4.702
Code:
SELECT    t2.Datum,
        t1.Raum,
        t1.Temp
FROM    (    SELECT    Raum,
                    max(Temp) AS Temp
            FROM    tabelle
            GROUP BY Raum ) t1
LEFT JOIN tabelle t2
ON        t2.Raum = t1.Raum
AND        t2.Temp = t1.Temp
Würde dir z.B. zu jedem Datum das der maximalen Raumtemperatur entspricht eine Zeile ausgeben.
 

ukulele

Datenbank-Guru
Beiträge
4.702
Funktioniert bei mir tadellos:
(jperson_fk ist quasi der Raum, wert die Temperatur und punkte die Tabelle)
Code:
SELECT    count(DISTINCT jperson_fk)
FROM    punkte
--4875 Treffer

SELECT    count(jperson_fk)
FROM    punkte
--43112 Treffer

SELECT    (    SELECT    max(t2.Datum)
            FROM    punkte t2
            WHERE    t2.jperson_fk = t1.jperson_fk
            AND        t2.wert = t1.wert ) AS Datum,
        t1.jperson_fk,
        t1.wert
FROM    (    SELECT    jperson_fk,
                    max(wert) AS wert
            FROM    punkte
            GROUP BY jperson_fk ) t1
--4875 Treffer, eine Zeile für jeden eindeutigen Raum mit dem max Datum dazu

SELECT    t2.Datum,
        t1.jperson_fk,
        t1.wert
FROM    (    SELECT    jperson_fk,
                    max(wert) AS wert
            FROM    punkte
            GROUP BY jperson_fk ) t1
LEFT JOIN punkte t2
ON        t2.jperson_fk = t1.jperson_fk
AND        t2.wert = t1.wert
--5196 Treffer, eine Zeile für jeden Raum und jedes Datum an dem der Wert dem max Wert entspricht
 

ukulele

Datenbank-Guru
Beiträge
4.702
Das liefert die 2te Abfrage mit dem Join.
Code:
SELECT    t2.Datum,
        t1.Raum,
        t1.Temp
FROM    (    SELECT    Raum,
                    max(Temp) AS Temp
            FROM    tabelle
            GROUP BY Raum ) t1
LEFT JOIN tabelle t2
ON        t2.Raum = t1.Raum
AND        t2.Temp = t1.Temp
Pro Raum eine Zeile, die maximale Temperatur und das zugehörige Datum. Wenn in dem Raum die maximale Temperatur an mehr als einem Datum eingetragen wurde wird für jeden Eintrag eine Zeile geliefert.

Beispiel Daten:
Raum A, Temp 20, Datum 01.01.2013
Raum A, Temp 19, Datum 02.01.2013
Raum B, Temp 11, Datum 01.02.2013
Raum B, Temp 10, Datum, 02.02.2013
Raum B, Temp 11, Datum 03.02.2013
liefert:
Raum A, Temp 20, Datum 01.01.2013
Raum B, Temp 11, Datum 01.02.2013
Raum B, Temp 11, Datum 03.02.2013
 

Steven85

Benutzer
Beiträge
12
Das ist auch nicht mein Wunschergrebnis, das was ich will würde folgendes ausgeben.
Es gibt Raum A, B und C. In der Tabelle DatumRaum gibt es unzählige Datumswerte zu den jeweiligen Räumen
mit seiner Ist Temperatur. Ich will von jedem Raum die jemals erreichte Max(Temp) und wann das war, was bedeutet das das Ergebnis 3 Datensätze liefern müsste, z.B.:

Raum A, Temp 22, Datum 01.10.13
Raum B, Temp 23, Datum 05.10.13
Raum C, Temp 21, Datum 12.06.12
 
Werbung:
Oben