SQL Count + Running Total in a single column
我对 SQL 还很陌生,所以请多多包涵。
我有一个带有日期列 (Date) 和计数列 (Count)
的表 (DataTable)
- 2015 年 1 月 1 日 10
- 2015 年 1 月 2 日 9
- 2015 年 1 月 3 日 12
- 2015 年 1 月 4 日 7
- 2015 年 1 月 5 日 8
- 2015 年 1 月 6 日 10
- 2015 年 1 月 7 日 10
- 2015 年 1 月 8 日 8
- 2015 年 1 月 9 日 9
- 2015 年 1 月 10 日 10
- 2015 年 1 月 11 日 11
- 2015 年 1 月 12 日 11
我需要创建一个新表来计算:计数、运行总计、运行财政年度、运行 12 个月。然后将这些全部添加到一个列中,并添加一个新的类别列,将这些总和按"月"、"合同日期"、"财政年度"和"12 个月到月底"分开。
结果将是
- 2015 年 1 月 1 日 10 个月
- 2015 年 1 月 2 日 9 个月
- 2015 年 1 月 3 日 12 个月
- 2015 年 1 月 4 日 7 个月
- 2015 年 1 月 5 日 8 个月
- 2015 年 1 月 6 日 10 个月
- 01/07/2015 10 个月
- 2015 年 1 月 8 日 8 个月
- 2015 年 1 月 9 日 9 个月
- 2015 年 1 月 10 日 10 个月
- 2015 年 1 月 11 日 11 个月
- 2015 年 1 月 12 日 11 个月
- 01/01/2015 10 合同至今
- 2015 年 1 月 2 日 19 合同至今
- 01/03/2015 31 合同至今
- 01/04/2015 39 合同至今
- 01/05/2015 47 合同至今
- 2015 年 1 月 6 日 57 合同至今
- 01/07/2015 67 合同至今
- 2015 年 1 月 8 日 75 合同至今
- 2015 年 1 月 9 日 84 合同至今
- 2015 年 1 月 10 日 94 合同至今
- 2015 年 1 月 11 日 105 合同至今
- 2015 年 1 月 12 日 116 合同至今
- 等等
我将如何在一个查询中对这一切进行编程(无需创建 4 个单独的表)
我需要使用 SQL Server Management Studio 2008 或 2008r2
据我所知:
1 2 3 4 5 6 7 8 9 10 11 12 13 | SELECT * INTO DataTableFinal FROM ( SELECT DATE, COUNT FROM DataTable UNION ALL SELECT DATE, COUNT = SUM (COUNT) OVER (ORDER BY DATE ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM DataTable UNION ALL SELECT DATE, COUNT = FROM DataTable UNION ALL SELECT DATE, COUNT = FROM DataTable ) AS tmp |
我不认为 sql server 2008 在窗口函数中支持
1 2 3 4 5 6 7 8 | SELECT dates,[COUNT],'MOnth' FROM Yourtable UNION ALL SELECT dates,run,'Contract to Date' FROM Yourtable a CROSS apply (SELECT SUM([COUNT]) FROM Yourtable b WHERE a.dates >= b.dates) cs (run) |
SQLFIDDLE 演示
最终结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | SELECT dates,[COUNT],'Month' FROM Yourtable UNION ALL SELECT dates,cnt,'Contract to Date' FROM Yourtable a CROSS apply (SELECT SUM([COUNT]) FROM Yourtable b WHERE a.dates >= b.dates) cs (cnt) UNION ALL SELECT dates,cnt,'12 Months to End Date' FROM Yourtable a CROSS apply (SELECT SUM([COUNT]) FROM Yourtable b WHERE a.dates >= b.dates AND b.dates >= DATEADD(MONTH, -12, a.dates)) cs (cnt) UNION ALL SELECT dates,cnt,'Financial Year' FROM Yourtable a CROSS apply (SELECT SUM([COUNT]) FROM Yourtable b WHERE a.dates >= b.dates AND b.dates >= DATEADD(YEAR,DATEDIFF(MONTH,'19100701',a.dates)/12,'19100701')) cs (cnt) |