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

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
Link zu diesem Kommentar

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.

Link zu diesem Kommentar

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.

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

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...