2016-11-15 3 views
0

ich eine SQL-Abfrage wie folgt aussehen:Wie kann ich aggregieren Daten basierend auf Unterabfrageergebnisse

SELECT (SUM(DURATIONSECS)/3600.00) AS LaborHrs, 
(SELECT LABORLEV2 t2 FROM LABOR WHERE LABORID = t1.LABORID) As Dept 
FROM Table1 t1 
WHERE DTM BETWEEN 'datetime1' AND 'datetime2' AND 
(SELECT LABORLEV1 FROM LABOR WHERE LABORID = t1.LABORID) = '100' 
AND PAYCODEID='1' 
Group BY LABORID 

Das gibt mir die richtigen Daten wie folgt aus:

LaborHrs  Dept 
90.5000000  office 
1033.2500000 retail 
522.2500000  retail 
217.5000000  misc 
1145.5000000 misc 
40.0000000  retail 

Jedoch habe ich die Ergebnisse müssen Wenn der Name der Abteilung gleich ist, muss ich die Summe aller Arbeitsstunden von "Einzelhandel" und "Verschiedenes" in derselben Spalte angeben. Ich habe versucht, nach Abteilung zu gruppieren, aber es hat diesen Spaltennamen nicht erkannt.

+0

GROUP BY funktioniert nur, wenn die Spalte Sie ausgewählt ist bereits verfügbar über die FROM-Klausel, daher müssen Sie es beitreten. – DVT

Antwort

3

Ich schrieb Ihre Anfrage auf dem, was ich Ihre Frage verstehen, aber ich bin ich ziemlich verdächtig dieser Teil:

DTM BETWEEN 'datetime1' AND 'datetime2' 

Ich gehe davon aus, dass es sich um einen Datetime-Variable oder Zahl ist, die Sie in ersetzen würden. Wenn das der Fall ist, denke ich, hier könnte die Antwort sein.

SELECT (SUM(DURATIONSECS)/3600.00) AS LaborHrs, 
    , l1.LABORLEV2 AS Dept 
FROM Table1 t1 
    JOIN LABOR l1 ON l1 ON l1.LABORID=t1.LABORID 
WHERE DTM BETWEEN 'datetime1' AND 'datetime2' AND l1.LABORLEV1='100' 
    AND t1.PAYCODEID='1' 
Group BY t1.LABORID, l1.LABORLEV2 
+0

Einige Korrekturen an der Abfrage. – DVT

+0

Entschuldigung, ich hätte angeben sollen Ich habe gerade Datumswerte auf DatumZeit1 und DatumZeit2 geändert. – user3839756

+0

Danke, das einzige, was ich ändern musste, war l1.LABORLEV2 bis PAYCODEID in der Group BY-Klausel – user3839756

1

Wenn Sie eine Spalte gruppieren möchten, darf die Spalte kein Subselect sein, daher müssen Sie die Abfrage mit JOINS neu schreiben.

Durch was ich understant Ihrer Abfrage, können Sie die Tabellen TABL1 und LABOR und kaufen Sie Ihre Bedingungen zu einer einzigen WHERE Aussage bewegen, so etwas wie folgt aus:

SELECT 
    l.LABORLEV2 AS Dept, 
    (SUM(t1.DURATIONSECS)/3600.00) AS LaborHrs 
FROM Table1 t 
INNER JOIN LABOR l ON t.LABORID=l.LABORID 
WHERE 
    l.LABORLEV1='100' AND 
    t1.PAYCODEID='1' AND 
    t1.DTM BETWEEN 'datetime1' AND 'datetime2' 
GROUP BY l.LABORLEV2 
Verwandte Themen