Problem mit GROUP BY



  • Hallo,

    ich habe folgende Tabelle:

    ID | IDENT | DATUM_IN | DATUM_OUT
    1...|...33....|.01.01.2017.|.02.01.2017
    2...|...33....|.02.01.2017.|.02.01.2017
    3...|...37....|.01.01.2017.|.02.01.2017
    4...|...38....|.01.01.2017.|.02.01.2017
    5...|...37....|.03.01.2017

    Jetzt m├Âchte ich die Daten nach IDENT gruppieren. Meine Abfrage sieht so aus:

    select IDENT, DATUM_IN, DATUM_OUT from T_DATA where DATUM_IN > '28.12.2016' GROUP BY T_DATA.DATUM_IN
    

    Leider bekomme ich so folgenden Fehler im SQL-Manager angezeigt:

    Dynamic SQL Error.
    SQL error code = -104.
    User name required.

    Lasse ich das 'GROUP BY' weg, funktionierts ­čśĽ

    Gru├č
    Torsten



  • Hallo,

    torsten_156 schrieb:

    Jetzt m├Âchte ich die Daten nach IDENT gruppieren. Meine Abfrage sieht so aus:

    select IDENT, DATUM_IN, DATUM_OUT from T_DATA where DATUM_IN > '28.12.2016' GROUP BY T_DATA.DATUM_IN
    

    Und um nach IDENT zu gruppieren, gruppierst du nach DATUM_IN ­čśĽ

    Aber auch nach IDENT zu gruppieren funktioniert so nicht. Was soll denn dann in DATUM_IN stehen, wenn zu zwei gleichen Idents unterschiedliche Datum_in vorhanden sind?
    Umgekehrt genauso. ├ťberlege dir vielleicht erstmal, was du ├╝berhaupt willst.



  • Stichwort: Aggregatsfunktionen



  • Hallo,

    Jockelx schrieb:

    ...
    Aber auch nach IDENT zu gruppieren funktioniert so nicht. Was soll denn dann in DATUM_IN stehen, wenn zu zwei gleichen Idents unterschiedliche Datum_in vorhanden sind?
    Umgekehrt genauso. ├ťberlege dir vielleicht erstmal, was du ├╝berhaupt willst.

    Im SQL-Manager kann ich nach IDENT gruppieren. Als Ergebnis wird mir die Datenmenge (also jeder Eintrag mit ID, DATUM_IN, DATUM_OUT) je IDENT angezeigt.

    http://www.bilder-upload.eu/show.php?file=9dac72-1483515773.jpg

    Gru├č
    Torsten



  • Na IDENT wird halt ein reservierter Name sein. F├╝r irgend eine Funktion bez├╝glich Usermanagement. Wird vermutlich die User-ID zur├╝ckliefern. Daher auch die Fehlermeldung "User name required.".

    GROUP BY IDENT
    =>
    GROUP BY [IDENT]



  • Das macht Sinn. Leider mag er die eckige Klammer nicht ­čś×
    Habe auch schon ' und ( versucht. Ohen Erfolg...



  • torsten_156 schrieb:

    Im SQL-Manager kann ich nach IDENT gruppieren. Als Ergebnis wird mir die Datenmenge (also jeder Eintrag mit ID, DATUM_IN, DATUM_OUT) je IDENT angezeigt.

    http://www.bilder-upload.eu/show.php?file=9dac72-1483515773.jpg

    Was du da siehst, ist aber nicht das Ergebnis eines GROUP BY. GROUP BY liefert dir einen Datensatz pro IDENT. Genau einen.



  • Das stimmt so nicht. Wenn du dir das Beispiel auf dieser Seite (http://www.w3schools.com/sql/sql_groupby.asp) einmal anschaust, kann man erkennen, dass im Ergebnis die Anzahl der Sendungen pro Sender ausgegeben wird.
    Und genau solch eine Ausgabe, also Anzahl Buchungen pro IDENT-Nummer in einem gewissen Zeitraum.

    Gru├č
    Torsten



  • torsten_156 schrieb:

    Das stimmt so nicht.

    Doch, das stimmt.

    torsten_156 schrieb:

    Wenn du dir das Beispiel auf dieser Seite (http://www.w3schools.com/sql/sql_groupby.asp) einmal anschaust, kann man erkennen, dass im Ergebnis die Anzahl der Sendungen pro Sender ausgegeben wird.

    Richtig. Anzahl ist eine der von Th69 erw├Ąhnten Aggregatfunktionen.
    Wichtiger ist aber, dass das Beispiel keine Details einzelner Sendungen anzeigt. Genau das scheinst du aber zu wollen.

    Jedes Feld, das nicht Bestandteil deiner GROUP BY-Klausel ist, kann nur als Argument einer Aggregatfunktion in deinem SELECT auftauchen.

    Zeig doch mal, wie deiner Meinung nach das Ergebnis deiner Abfrage aussehen soll. Vermutlich suchst du gar nicht GROUP BY.



  • Wenn ich mal genauer ├╝berlege, welches Ergebnis ich eigentlich brauche, sollte ein select ausreichen. Denn ich m├Âchte die Anzahl an Anmeldungen pro Tag (DATUM_IN) des jeweiligen Users (IDENT). Dazu dann noch die jeweiligen Minuten dazu (TIME_MIN).

    Die erste Idee war eigentlich eine Liste pro User und Anmeldeanzahl pro Tag. Daher das GROUP BY.

    Aber ├╝ber select sollte es gehen.

    Vielen Dank aber f├╝r eure Unterst├╝tzung ­čĹŹ

    Gru├č
    Torsten



  • torsten_156 schrieb:

    Dazu dann noch die jeweiligen Minuten dazu (TIME_MIN).

    Wenn du die Summe der Minuten brauchst: Das w├╝rde mit GROUP BY funktionieren. SUM ist auch eine Aggregatfunktion.

    torsten_156 schrieb:

    Die erste Idee war eigentlich eine Liste pro User und Anmeldeanzahl pro Tag. Daher das GROUP BY.

    Deine Ausdrucksweise ist ziemlich ungenau. Was meinst du mit "pro Tag"?

    Zeig doch bitte, wie du dir das Abfrageergebnis vorstellst, dann muss man nicht herumraten, was du meinst.



  • Wenn ich es richtig verstehe will er so etwas:

    select IDENT, DATUM_IN, COUNT(*) as ANZAHL, SUM(TIME_MIN) as MINUTEN
    from T_DATA
    where DATUM_IN > '28.12.2016'
    GROUP BY IDENT, DATUM_IN
    


  • torsten_156 schrieb:

    Das macht Sinn. Leider mag er die eckige Klammer nicht ­čś×
    Habe auch schon ' und ( versucht. Ohen Erfolg...

    Ich hab' irgendwie T-SQL angenommen, keine Ahnung warum.
    Egal, die Alternative zu [Some Identifier] ist "Some Identifier" . Ja, wirklich, mit doppelten ". Seltsam, ist aber so. Mit ' macht man 'String Konstanten' . Und runde Klammern sind sowieso f├╝r ganz 'was anderes.

    Und ja, zeig mal das SELECT was du aktuell hast, was bei dir mit diesem "User name required." fehlschl├Ągt.


Log in to reply