2017-01-27 9 views
0

実行中の合計を作成するには、OVER(PARTITION BY)を使用して合計を作成しようとしています。合計実行月、年でグループ化されたデータセットの場合

私の元のクエリ:

SELECT DATEPART(MONTH, t.received_date) AS [Month], 
DATEPART(YEAR, t.received_date) AS [Year], 
SUM(rdai.number_of_pages) AS [Count] 
FROM dbo.request_document_additonal_information AS [rdai] 
INNER JOIN #TempRequestIDs AS [t] 
    ON rdai.request_id = t.id 
GROUP BY DATEPART(MONTH, t.received_date), 
DATEPART(YEAR, t.received_date) 
ORDER BY Year, 
Month; 

と結果:

Month Year Count 
10  2015 1202342 
11  2015 1059471 
12  2015 1142629 
1  2016 1081412 
2  2016 1181385 
3  2016 1334966 

私の目標は、月ごとに実行されている小計を作成することであり、私の試みがそうする:

SELECT DATEPART(MONTH, t.received_date) AS [Month], 
DATEPART(YEAR, t.received_date) AS [Year], 
SUM(rdai.number_of_pages) AS [Count] 
,SUM(rdai.number_of_pages) OVER (PARTITION BY DATEPART(MONTH, t.received_date), DATEPART(YEAR, t.received_date) 
           ORDER BY DATEPART(MONTH, t.received_date), DATEPART(YEAR, t.received_date) 
           RANGE UNBOUNDED PRECEDING 
           ) as [RunningTotal] 
FROM dbo.request_document_additonal_information AS [rdai] 
INNER JOIN #TempRequestIDs AS [t] 
    ON rdai.request_id = t.id 
GROUP BY DATEPART(MONTH, t.received_date), 
DATEPART(YEAR, t.received_date) 
ORDER BY Year, 
Month; 

エラーが返されました:

Column 'dbo.request_document_additonal_information.number_of_pages' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause. 

GROUP BY .... rdai.number_of_pagesを追加すると、実行中の合計が表示されますが、すべての列で同じ数値になります。

このWindowed関数を使用して私がどこに間違っているかについて助けを得ることができますか?動作しますが、それは時に年の変更リセットん -

おかげで、

答えて

2

1つのオプションは、巣にあなたの元のクエリ

Select A.* 
     ,RunningTotal = sum(count) over (Order by Year ,Month) 
From (
     SELECT DATEPART(MONTH, t.received_date) AS [Month], 
     DATEPART(YEAR, t.received_date) AS [Year], 
     SUM(rdai.number_of_pages) AS [Count] 
     FROM dbo.request_document_additonal_information AS [rdai] 
     INNER JOIN #TempRequestIDs AS [t] 
      ON rdai.request_id = t.id 
     GROUP BY DATEPART(MONTH, t.received_date), 
     DATEPART(YEAR, t.received_date) 
    ) A 
ORDER BY Year,Month; 
+0

おかげジョンです。その周りには何か方法はありますか? – MISNole

+0

@MISNole確か。申し訳ありませんが、あなたは再設定が必要だったと仮定しました。更新された回答を参照してください...パーティションを削除し、年、月の順番を変更しました –

+0

ありがとうございます - この場合、リセットは必要ありませんでしたが、今後の使用のために両方の例を保存します。それは有り難いです。 – MISNole

関連する問題