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
我不认为 sql server 2008 在窗口函数中支持 sum() 和 order by。试试这样的
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 演示
- 谢谢你的工作,我已经设法让 12 个月的工作结束日期,但我似乎无法弄清楚财政年度(澳大利亚从 6 月开始)
最终结果:
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) |
来源:https://www.codenong.com/32086419/