2017-08-11 2 views
1

So habe ich diesen Code und es funktioniert nicht:Warum werden meine Aggregate nicht gruppiert?

SET DATEFIRST 1 
SELECT 
    WeekNumber-1 AS [WeekNumber], 
    EmplName, 
    ROUND(SUM(ManHrs), 2) AS [ManHrs], 
    ROUND((SUM(ManHrs) OVER(PARTITION BY EmplName)/((CONVERT(FLOAT, GETDATE())- 
    CONVERT(FLOAT, DATEADD(dd, 
    ((DATEDIFF(dd,'17530101',GETDATE())/7)*7)-29,'17530101')))/7)), 2) AS [Avg 
    Weekly Man Hrs] 
FROM 
(
    SELECT 
    DATEPART(wk, TicketDate) AS WeekNumber, 
    e.EmplName, 
    t.WorkCntr, 
    t.ManHrs 
    FROM TimeTicketDet t JOIN EmplCode e ON t.EmplCode = e.Emplcode 
    WHERE CONVERT(DATE, TicketDate) > DATEADD(dd, 
((DATEDIFF(dd,'17530101',GETDATE())/7)*7)-29,'17530101') 
) AS [Subquery] 
GROUP BY WeekNumber, EmplName 
ORDER BY 2, 1 

Der Fehler sagt „Spalte‚Subquery.ManHrs‘in der Auswahlliste ungültig, da sie nicht in einer Aggregatfunktion oder die GROUP enthalten sind BY-Klausel "

Also wenn ich ManHRS zur GROUP BY-Klausel hinzufügen, wird der Code ausgeführt, aber nichts ist gruppiert. Nicht sicher, was ich falsch mache

Hier ist ein Screenshot des Codes ausgeführt wird, indem die ManHrs an die GROUP BY-Klausel hinzufügen, wenn es einfacher ist, zu lesen:

enter image description here

EDIT: Okay, so ich es dachte, mit Hilfe von Rominus aus, hier ist der Code wie beabsichtigt:

enter image description here

+0

Fügen Sie Ihre Aggregation zu Ihrer Gruppierung hinzu –

+0

Wenn ich das mache, bekomme ich alle Datensätze, wie Sie auf dem Screenshot sehen können. Jeder Mitarbeiter sollte nur 5 Datensätze haben, für die Wochen 28-32 –

+0

Nein, ich meine buchstäblich fügen Sie den Aggregatausdruck der Gruppe anstelle von nur die Spalte. Wenn das nicht die Ergebnisse bringt, gruppieren Sie vielleicht in der Unterabfrage? Mit der CONVERT- und DATEDIFF-Klausel in der WHERE-Klausel wird wahrscheinlich auch die Leistung beeinträchtigt. Wenn Sie das vermeiden können, würde ich es empfehlen. –

Antwort

1

Ihre GROUP BY nicht funktioniert weil es die verschiedenen Werte von ManHrs beim Gruppieren betrachtet, also Zeilen mit verschiedenen ManHrs-Werten in verschiedenen Gruppen betrachtet. Was Sie tun müssen, ist die Summe der ManHrs nach Woche, bevor Sie für die Mittelung gruppieren. So sollten Sie sich mit zwei Schichten von Unterabfrage beenden, die so etwas wie dieses vereinfachten Beispiel aussehen:

SELECT a.EmplName, a.WeekNumber, SUM(a.Manhrs) as totHrs 
FROM 
    (SELECT 
    DATEPART(wk, TicketDate) AS WeekNumber 
    , e.EmplName 
    , t.ManHrs 
    FROM TimeTicketDet t JOIN EmplCode e ON t.EmplCode = e.Emplcode) as a 
group by a.EmplName, a.WeekNumber 

Sobald Sie diese Art von Unterabfrage haben Sie Ihre Lungs und so in der äußeren Abfrage tun.

+0

Ich habe es mit Ihrer Hilfe herausgefunden, schrieb den endgültigen Code in meiner Frage, danke –

Verwandte Themen