SQL GROUP BY



  • Hi Leute,

    ich habe hier eine MS SQl-Datenbank. Dort stehen Einträge drin, die folgendermaßen aufgebaut sind:
    ID, Datum, Stunden

    Ich würde jetzt gerne einen select machen, der mir alle mit der selben ID und dem selben Monat zusammenfasst, hab aber keine Ahnung, wie... Wenn ich alle mit dem exakt gleichen Datum zusammenfassen wollen würde, würde ich das ja so machen:

    SELECT ID, Datum, SUM(Stunden) AS TOTAL FROM MyTable GROUP BY ID, DATUM

    Aber wie mach ich es jetzt, wenn ich nicht nach dem exakten Datum sondern nach dem Monat gruppieren möchte?



  • Gibts keine to_char()-Funktion, o.Ä. wie in Oracle?

    SELECT id, to_char('MM',datum), sum(stunden) AS total FROM mytable GROUP bY id, to_char('MM',datum);
    

    MfG SideWinder



  • GROUP BY id, MONTH(datum)

    Sollte eigentlich gehen... Kann sein, dass die Funktion etwas anders heißt

    // Edit: Jup, Month ist richtig - Obs funktioniert, musst du aber selbst testen
    hab gerade kein mySQL hier.



  • so tut das:

    SELECT     ID, MONTH(Datum) AS Month, YEAR(Datum) AS YEAR, SUM(Hours) AS TOTAL
    FROM         mytable
    GROUP BY id, MONTH(datum), YEAR(datum)
    


  • Dann kannst auch

    SELECT     ID, MONTH(Datum) AS Month, YEAR(Datum) AS Year SUM(Hours) AS TOTAL
    FROM         mytable
    GROUP BY id, Month, Year
    

    schreiben 😉



  • ne. wieso sollte ich?



  • Weil du dann die doppelte "Berechnung" sparst. Ich bin mir nicht sicher wie weit
    mySQL das herausoptimieren kann.



  • Mir eigentlich auch egal, was mySQL macht, ich benutze den MS SQL 😉

    Jedenfalls geht es nicht, bekommen einen Syntaxfehler für Month.
    Man kann offensichtlich nicht nach Spalten gruppieren lassen, die erst in der SQL-Anweisung definiert werden.



  • Mal nur so nebenbei. Wenn deie Tabelle so aussieht dann hast du ein gravierendes Problem.
    Die Regel Nr.1 bei einem RDBMS ist: Jeder Datensatz muss eindeutig identifizierbar sein.
    Sollte dies nicht der Fall sein kann es zu unvorhersehbaren Ergebnissen in der Ergebnissmenge kommen.



  • Soll ich also noch ne Spalte mit nem Autoincrement einfügen?
    Was kann es denn für unvorhergesehene Ergebnisse geben?



  • Vor allem Lösch- und Updateprozesse können riskant werden. Und selbst wenn es
    jetzt noch nicht notwendig sein kann: Jeder Datensatz in einer Datenbank sollte
    eindeutig identifierbar sein - das erhöht die Geschwindigkeit auch gleich um
    ein Vielfaches.


Anmelden zum Antworten