SQL Serverで累計を算出する
レコード毎に前レコードからの累計を算出するSQLを紹介します。
コーディング例
BEGIN CREATE TABLE #勤怠( 氏名 VARCHAR(10) ,年月 INT ,日 INT ,勤務時間 INT ); INSERT INTO #勤怠 VALUES ('佐藤',201909,1,500) ,('佐藤',201909,2,550) ,('佐藤',201909,3,0) ,('佐藤',201909,4,600) ,('佐藤',201909,5,450) ,('山本',201909,1,0) ,('山本',201909,2,460) ,('山本',201909,3,510) ,('山本',201909,4,410) ,('山本',201909,5,610) ,('田中',201909,1,520) ,('田中',201909,2,620) ,('田中',201909,3,0) ,('田中',201909,4,570) ,('田中',201909,5,470) ,('佐藤',201910,1,500) ; SELECT 氏名 ,日 ,勤務時間 ,SUM(勤務時間) OVER (PARTITION BY 氏名 ORDER BY 日 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS [前日] FROM #勤怠 WHERE 年月 = 201909 GROUP BY 氏名 ,勤務時間 ,日 ORDER BY 氏名 ,日 ; DROP TABLE #勤怠; END
実行結果
氏名 | 日 | 勤務時間 | 累計 |
---|---|---|---|
佐藤 | 1 | 500 | 500 |
佐藤 | 2 | 550 | 1050 |
佐藤 | 3 | 0 | 1050 |
佐藤 | 4 | 600 | 1650 |
佐藤 | 5 | 450 | 2100 |
山本 | 1 | 0 | 0 |
山本 | 2 | 460 | 460 |
山本 | 3 | 510 | 970 |
山本 | 4 | 410 | 1380 |
山本 | 5 | 610 | 1990 |
田中 | 1 | 520 | 520 |
田中 | 2 | 620 | 1140 |
田中 | 3 | 0 | 1140 |
田中 | 4 | 570 | 1710 |
田中 | 5 | 470 | 2180 |
34行目の、「PARTITION BY 氏名」で氏名毎にグループ化することを指定し、「ORDER BY 日」で日の昇順で並び替えすることを指定し、「ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW」では参照レコードの開始を「UNBOUNDED PRECEDING」とすることでグループ化した先頭レコードを指定し、参照レコードの終了を「CURRENT ROW」とすることでカレントレコードを指定しています。
これによりグループ化した先頭レコードからカレントレコードまでの合計(SUM)、すなわち累計が算出されます。
以上、「SQL Serverで累計を算出する」の紹介でした。