Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Group By auf Mehrere Spalten

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von Steven85, 21 November 2013.

  1. Steven85

    Steven85 Benutzer

    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.
     
  2. ukulele

    ukulele Datenbank-Guru

    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
     
  3. Steven85

    Steven85 Benutzer

    Wieso Max(Datum)?
     
  4. Steven85

    Steven85 Benutzer

    Und Warum "AND t2.Temp = t1.Temp", Temp gibts nur in Tabelle 2
     
  5. ukulele

    ukulele Datenbank-Guru

    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.
     
  6. ukulele

    ukulele Datenbank-Guru

    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.
     
  7. Steven85

    Steven85 Benutzer

    Funktioniert so nicht da er mir so sämtlichen Datumswerte mit den Temperaturen und dem dazugehörigen Raum ausgibt
     
  8. ukulele

    ukulele Datenbank-Guru

    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
     
  9. Steven85

    Steven85 Benutzer

    Ich will aber nicht Max(Datum), sondern das Datum zu Max(Temp)
     
  10. ukulele

    ukulele Datenbank-Guru

    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
     
  11. Steven85

    Steven85 Benutzer

    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
     
  12. Steven85

    Steven85 Benutzer

    Doch, es ist korrekt, das Problem ist das eine gewisse Temperatur mehrmals erreicht wurde. War ein Denkfehler.

    Vielen Dank
     
  13. ukulele

    ukulele Datenbank-Guru

    Eben drum, daher hatte ich am Anfang im Subselect nochmal max(Datum) weil es mehrere geben kann die zu max(Temp) passen.
     
    Steven85 gefällt das.
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden