Jump to content

Sql Select Aggregatfunktion und Case


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Geschrieben (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 von Isii
Geschrieben

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.

Geschrieben

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.

Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Erstelle ein Benutzerkonto oder melde dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde dich hier an.

Jetzt anmelden
×
×
  • Neu erstellen...