Isii 0 Geschrieben 10. April 2015 Melden Teilen Geschrieben 10. April 2015 (bearbeitet) Hallo zusammen, ich habe eine Abfrage über eine Tabelle, die mir summierte Einsatzzeiten gruppiert nach Jahr, Ort, Produkt zurückgeben soll. Die Daten in der Tabelle Dispo liegen in folgender Form vor Datum, Ort, Produkt, Anfang, Ende 03.01.2015,Berlin, 401, 10:00, 11:00 ->(1 Std) 04.01.2015,Berlin, 401, 15:00, 16:00 -> (1 Std) 01.01.2015,Rom, 401, 10:00, 15:00 -> (5 Std) 02.01.2015,Rom, 402, 10:00, 11:00 -> (1 Std) 02.01.2015,Rom, 402, 20:00, 01:00 -> (5 Std) Rauskommen soll: Jahr, Ort, Produkt, EStd 2015, Berlin, 401, 2.00 2015, Rom, 401, 5.00 2015, Rom, 402, 6.00 Der erste Ansatz war: SELECT Year(Datum) AS JAHR, Ort, Produkt, Sum (DATEDIFF(n, Anfang, Ende))/60.00 AS EStd FROM Dispo group by Year(Datum), Ort, Produkt Sah gut aus, aber da ein paar der Endzeiten über Mitternacht hinausgingen und somit die Berechnung von Datediff in irgendwelchen utopischen Minus Bereichen lag, habe ich dafür dann eine Fallunterscheidung mit CASE gemacht. SELECT Year(Datum) AS JAHR, Ort, Produkt, CASE WHEN Anfang>Ende THEN Sum (1440-(DATEDIFF(n, Ende,Anfang)))/60.00 ELSE Sum (DATEDIFF(n, Anfang, Ende))/60.00 END AS EStd FROM Dispo group by Year(Datum), Ort, Produkt Jetzt bekomme ich aber diese Fehlermeldung: Die Anfang-Spalte ist in der Auswahlliste ungltig, da sie nicht in einer Aggregatfunktion und nicht in der GROUP BY-Klausel enthalten ist. (Spalte 3) (Ende-Spalte analog) Ich will aber Anfang und Ende weder ausgeben noch darüber gruppieren, weil ich damit mehrere Summen pro Produkt bekomme. Irgendwelche Ratschläge? Vielen Dank und beste Grüße, Isii bearbeitet 10. April 2015 von Isii Zitieren Link zu diesem Kommentar
ukulele 11 Geschrieben 13. April 2015 Melden Teilen Geschrieben 13. April 2015 In diesem Fall sind die Datentypen der Spalten Anfang und Ende nicht unerheblich. Dies hier müsste aber so in etwa funktionieren: SELECT Jahr, Ort, Produkt, datediff(hour,Anfang,Ende) AS EStd FROM ( SELECT year(Datum) AS Jahr, Ort, Produkt, Datum + cast(Anfang AS DATETIME) AS Anfang, ( CASE WHEN Ende <= Anfang THEN dateadd(day,1,Datum) + cast(Ende AS DATETIME) ELSE Datum + cast(Ende AS DATETIME) END ) AS Ende FROM Dispo ) tabelle GROUP BY Jahr,Ort,Produkt Ich habe zunächst mal Anfang und Ende in ein DATETIME Format gebracht um sauber mit datediff() etc. arbeiten zu können. Das muss man natürlich nicht. Im Anschluss habe ich einen Select mit GROUP BY auf diese Abfrage ausgeführt, auch das kann man umstellen. Zitieren Link zu diesem Kommentar
Isii 0 Geschrieben 14. April 2015 Autor Melden Teilen Geschrieben 14. April 2015 Vielen Dank! :) Habe ich so übernommen und es kommt genau das raus, was rauskommen soll. Das Uhrzeitfeld ist Char(5), die Umwandlung in DATETIME ist sicher sauberer. Ich habe aber bei SUM (DATEDIFF ...) in Zeile 4 statt Hour trotzdem Minuten genommen und durch 60.0 geteilt, weil nicht nur volle Stunden, sondern auch Minuten bei der Dauer in der Dispo-Tabelle stehen und das Ergebniss als Dezimalzahl benötigt wird. Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.