2017-08-11 15 views
1

だから私はこのコードを持って、それが動作しません:なぜ私の集計グループはありませんか?

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 

エラーは、それが集計関数またはGROUPのいずれかに含まれていないため、「列 『Subquery.ManHrs』は、選択リストに無効であると言いますBY節 "

したがって、ManHrsをGROUP BY句に追加すると、コードは実行されますが、何もグループ化されません。それが読みやすいです場合、私は間違って

をやっているかわからここでは、GROUP BY句にManHrsを追加することによって実行されるコードのスクリーンショットですません:

enter image description here

EDIT:わかりましたので、は、 GROUP BYが動作していないあなたの

enter image description here

+0

グループに集計を追加 –

+0

これを行うと、スクリーンショットのようにすべてのレコードが取得されます。各従業員は週数28〜32の5つのレコードしか持たないようにしてください。 –

+0

いいえ、私は文字通り列の代わりに集計式をグループに追加しています。結果が得られない場合は、おそらくサブクエリをグループ化しますか?また、WHERE節のCONVERTおよびDATEDIFFを使用してパフォーマンスを強制終了している可能性があります。それを避けることができれば、私はそれをお勧めします。 –

答えて

1

:私はRominusの助けを借りてそれを考え出し、ここで意図したとおりに動作するコードですグループ化するときに異なるManHrsの値を調べるため、異なるManHrs値を持つ行が異なるグループにあると見なします。あなたがする必要があるのは、平均化のためにグループ分けする前に週ごとにマンハッタンを合計することです。だから、この単純化された例のようになり、サブクエリの二つの層、で終わるだろう:

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 

あなたはサブクエリのこの種を持っていたら、あなたは外側のクエリでは、あなたの平均と、このような操作を行うことができます。

+0

あなたの助けを借りて、私の質問に最終的なコードを投稿した、ありがとう –

関連する問題