none
Frage zum GROUP BY? RRS feed

  • Frage

  • Hallo,

    ich habe eine Tabelle 'dbo.termin' und mache folgende Abfrage:

    SELECT zugeteiltAn, 
    SUM(DATEDIFF ( MINUTE , start , ende )) AS Gesamt, 
    COUNT(zugeteiltAn)
    FROM dbo.termin 
    WHERE 
    (start >= '01.12.2016' AND start <'01.01.2017') AND 
    betreff!='U'
    GROUP BY zugeteiltAn, 
    zugeteiltAn ORDER BY zugeteiltAn ASC

    Möchte aber noch zusätzlich eine Spalte für die Anzahl der Spalte 'betreff' pro 'zugeteiltAn' auch haben:

    SELECT zugeteiltAn, 
    COUNT(betreff) 
    FROM dbo.termin 
    WHERE 
    betreff='U' AND 
    (start >= '01.12.2016' AND start <'01.01.2017') 
    GROUP BY zugeteiltAn, 
    zugeteiltAn ORDER BY zugeteiltAn ASC


    Kann jemand mir vielleicht bitte sagen, wie ich das machen könnte?


    Gruesse, NUNUI






    • Bearbeitet Nunui Donnerstag, 22. Dezember 2016 17:02
    Donnerstag, 22. Dezember 2016 16:54

Antworten

  • Hi,

    ich werd aus denen SQL Statements zusammen mit der Beschreibung nicht wirklich schlau. IMHO passt das nicht wirklich zusammen.

    Willst Du innerhalb der Gruppierung nach "zugeteiltAn" die Anzahl der unterschiedlichen Werte in der Spalte "betreff" wissen?

    Oder willst Du einfach die beiden gezeigten Statements anhand des Werts in zugeteiltAn miteinander verbinden und die ermittelte Anzahl der Datensätze aus dem zweiten Statement mit anzeigen?

    Falls letzteres, könnte man das bspw. so machen:

    WITH GroupedBetreffQuery AS
    (
    SELECT   zugeteiltAn,
             COUNT( betreff ) AS AnzahlBetreffzeilen
    FROM     Nunui_Termine
    WHERE    start BETWEEN '01.12.2016' AND '01.01.2017'
    AND      betreff = 'U'
    GROUP BY zugeteiltAn
    ), GroupedZugeteiltAnQuery AS
    (
    SELECT   t.zugeteiltAn,
             SUM( DATEDIFF( MINUTE, t.start, t.ende ) ) AS Gesamt, 
             COUNT( t.zugeteiltAn ) AS AnzahlZugeteiltAn
    FROM     Nunui_Termine t
    WHERE    t.start BETWEEN '01.12.2016' AND '01.01.2017'
    AND      t.betreff != 'U'
    GROUP BY t.zugeteiltAn
    )
    SELECT   gzq.zugeteiltAn,
             gzq.Gesamt, 
             gzq.AnzahlZugeteiltAn,
             gbq.AnzahlBetreffzeilen
    FROM     GroupedZugeteiltAnQuery gzq
             LEFT JOIN GroupedBetreffQuery gbq ON gzq.zugeteiltAn = gbq.zugeteiltAn
    ORDER BY gzq.zugeteiltAn ASC
    


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    • Als Antwort markiert Nunui Donnerstag, 22. Dezember 2016 22:25
    Donnerstag, 22. Dezember 2016 17:58
    Moderator
  • Hallo Nunui,

    als (sehr) kleines Weihnachtsgeschenk. Mit der Abfrage

    SELECT zugeteiltAn, SUM(CASE WHEN betreff != 'U' THEN DATEDIFF(MINUTE, start, ende ) ELSE 0 END) AS Gesamt, SUM(CASE WHEN betreff = 'U' THEN 1 ELSE 0 END) AS AnzahlUrlaub, SUM(CASE WHEN betreff != 'U' THEN 1 ELSE 0 END) AS AnzahlDienste FROM dbo.termin WHERE (CAST(start AS date) BETWEEN '20160901' AND start '20161001') AND Farbe != 'Schicht' GROUP BY zugeteiltAn, ORDER BY zugeteiltAn ASC

    benötigst Du nur einen (Bereichs) Scan anstatt mehrere und vermeidest auf einen FULL JOIN (mit seinen Nullen) zurückgreifen zu müssen.

    Frohes Fest
    Elmar

    • Als Antwort markiert Nunui Sonntag, 25. Dezember 2016 16:54
    Sonntag, 25. Dezember 2016 07:40
    Beantworter

Alle Antworten

  • Hi,

    ich werd aus denen SQL Statements zusammen mit der Beschreibung nicht wirklich schlau. IMHO passt das nicht wirklich zusammen.

    Willst Du innerhalb der Gruppierung nach "zugeteiltAn" die Anzahl der unterschiedlichen Werte in der Spalte "betreff" wissen?

    Oder willst Du einfach die beiden gezeigten Statements anhand des Werts in zugeteiltAn miteinander verbinden und die ermittelte Anzahl der Datensätze aus dem zweiten Statement mit anzeigen?

    Falls letzteres, könnte man das bspw. so machen:

    WITH GroupedBetreffQuery AS
    (
    SELECT   zugeteiltAn,
             COUNT( betreff ) AS AnzahlBetreffzeilen
    FROM     Nunui_Termine
    WHERE    start BETWEEN '01.12.2016' AND '01.01.2017'
    AND      betreff = 'U'
    GROUP BY zugeteiltAn
    ), GroupedZugeteiltAnQuery AS
    (
    SELECT   t.zugeteiltAn,
             SUM( DATEDIFF( MINUTE, t.start, t.ende ) ) AS Gesamt, 
             COUNT( t.zugeteiltAn ) AS AnzahlZugeteiltAn
    FROM     Nunui_Termine t
    WHERE    t.start BETWEEN '01.12.2016' AND '01.01.2017'
    AND      t.betreff != 'U'
    GROUP BY t.zugeteiltAn
    )
    SELECT   gzq.zugeteiltAn,
             gzq.Gesamt, 
             gzq.AnzahlZugeteiltAn,
             gbq.AnzahlBetreffzeilen
    FROM     GroupedZugeteiltAnQuery gzq
             LEFT JOIN GroupedBetreffQuery gbq ON gzq.zugeteiltAn = gbq.zugeteiltAn
    ORDER BY gzq.zugeteiltAn ASC
    


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    • Als Antwort markiert Nunui Donnerstag, 22. Dezember 2016 22:25
    Donnerstag, 22. Dezember 2016 17:58
    Moderator
  • Danke für die Antwort!

    In meinem ersten Statement werden die Datensätze die den Betreff 'U' haben nicht ausgewertet: betreff != 'U'.

    Das was ich möchte, ist dass auch noch angezeigt wird, wieviel Datensätze davon betroffen waren, dass den Betreff 'U' hatten: betreff = 'U'?


    Gruesse, NUNUI

    Donnerstag, 22. Dezember 2016 21:17
  • Hi,

    na dann passt es doch.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Donnerstag, 22. Dezember 2016 22:16
    Moderator
  • VIELEN DANK UND WÜNSCHE DIR UND ALLEN IM FORUM EIN BESINNLICHE WEIHNACHTEN SOWIE EIN FROHES NEUES JAHR :o)

    Gruesse, NUNUI

    • Bearbeitet Nunui Donnerstag, 22. Dezember 2016 22:30
    Donnerstag, 22. Dezember 2016 22:29
  • Jetzt habe ich leider ein anderes Problem!

    Sobald erste Select leer ist (GroupedBetreffQuery) wird zweite Select (GroupedZugeteiltAnQuery) nicht mehr im Ergebnis angezeigt!

    Wie könnte ich das verhindern?


    Gruesse, NUNUI

    Samstag, 24. Dezember 2016 13:42
  • Hi,

    LEFT JOIN sollte eigentlich genau das verhindern, bei mir klappt das auch ohne Probleme.

    Poste bitte mal dein fertiges Statement.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Samstag, 24. Dezember 2016 14:40
    Moderator
  • Ich meine eigentlich, wenn der zweite Select  (GroupedDiensteQuery) leer ist, habe ich das Problem:

    USE kalender
    GO
    WITH GroupedUrlaubQuery AS
    (
    SELECT   zugeteiltAn,
             COUNT( betreff ) AS AnzahlUrlaub
    FROM     termin
    WHERE    start BETWEEN '01.09.2016' AND '01.10.2016'
    AND      betreff = 'U' AND farbe != 'Schicht'
    GROUP BY zugeteiltAn
    ), GroupedDiensteQuery AS
    (
    SELECT   t.zugeteiltAn,
             SUM( DATEDIFF( MINUTE, t.start, t.ende ) ) AS Gesamt, 
             COUNT( t.zugeteiltAn ) AS AnzahlDienste
    FROM     termin t
    WHERE    t.start BETWEEN '01.09.2016' AND '01.10.2016'
    AND      t.betreff != 'U' AND farbe != 'Schicht'
    GROUP BY t.zugeteiltAn
    )
    SELECT   gzq.zugeteiltAn AS BenutzerID,
             gzq.AnzahlDienste,
             gbq.AnzahlUrlaub
    FROM     GroupedDiensteQuery gzq
             LEFT JOIN GroupedUrlaubQuery gbq ON gzq.zugeteiltAn = gbq.zugeteiltAn
    ORDER BY gzq.zugeteiltAn ASC


    Gruesse, NUNUI

    Samstag, 24. Dezember 2016 15:22
  • Hallo Nunui,

    als (sehr) kleines Weihnachtsgeschenk. Mit der Abfrage

    SELECT zugeteiltAn, SUM(CASE WHEN betreff != 'U' THEN DATEDIFF(MINUTE, start, ende ) ELSE 0 END) AS Gesamt, SUM(CASE WHEN betreff = 'U' THEN 1 ELSE 0 END) AS AnzahlUrlaub, SUM(CASE WHEN betreff != 'U' THEN 1 ELSE 0 END) AS AnzahlDienste FROM dbo.termin WHERE (CAST(start AS date) BETWEEN '20160901' AND start '20161001') AND Farbe != 'Schicht' GROUP BY zugeteiltAn, ORDER BY zugeteiltAn ASC

    benötigst Du nur einen (Bereichs) Scan anstatt mehrere und vermeidest auf einen FULL JOIN (mit seinen Nullen) zurückgreifen zu müssen.

    Frohes Fest
    Elmar

    • Als Antwort markiert Nunui Sonntag, 25. Dezember 2016 16:54
    Sonntag, 25. Dezember 2016 07:40
    Beantworter
  • Super, jetzt funktioniert es so wie ich es will und auch an Allen ein frohes FEST :o)

    Gruesse, NUNUI

    Sonntag, 25. Dezember 2016 16:57