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.


Anmelden zum Antworten