SQL 计数 + 运行 单列总计
SQL Count + Running Total in a single column
我是 SQL 的新手,所以请多多包涵。
我有一个带有日期列 (Date) 和计数列 (Count)
的 table (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
我需要创建一个新的 table 来计算:计数,运行 总数,运行 财政年度,运行 12 个月。然后将这些全部添加到一列中,并添加一个新的类别列,用 'month'、'Contract to Date'、'Financial Year' 和“12 个月到结束月”分隔这些总和。
- 月份显示该月的计数
- 迄今为止的合同就像 运行 从开始日期到结束日期的总数
- 财政年度从 6 月开始,就像 运行 总数一样,直到它到达下一年的 5 月,之后即将到来的 6 月将重置其计数
- 结束月份的 12 个月将前 11 个月添加到当前月份
结果会是
- 01/01/2015 10 月
- 01/02/2015 9 月
- 2015 年 1 月 3 日 12 月
- 01/04/2015 7 月
- 01/05/2015 8 月
- 01/06/2015 10 月
- 01/07/2015 10 月
- 01/08/2015 8 月
- 2015 年 1 月 9 日 9 月
- 01/10/2015 10 月
- 01/11/2015 11 月
- 2015 年 1 月 12 日 11 月
- 01/01/2015 10 合同
- 01/02/2015 19 合约至今
- 01/03/2015 31 合同
- 01/04/2015 39 合约至今
- 01/05/2015 47 合同
- 01/06/2015 57 合同
- 01/07/2015 67 合同
- 01/08/2015 75 合同
- 01/09/2015 84 合同
- 01/10/2015 94 合同
- 01/11/2015 105 份合同
- 01/12/2015 116 合同
- 等
我如何在单个查询中对这一切进行编程(无需创建 4 个单独的 tables)
我需要使用 SQL Server Management Studio 2008 或 2008r2
据我所知:
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 不支持 sum()
和 window 中的 order by
功能。尝试这样的事情
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)
最终结果:
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)
我是 SQL 的新手,所以请多多包涵。 我有一个带有日期列 (Date) 和计数列 (Count)
的 table (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
我需要创建一个新的 table 来计算:计数,运行 总数,运行 财政年度,运行 12 个月。然后将这些全部添加到一列中,并添加一个新的类别列,用 'month'、'Contract to Date'、'Financial Year' 和“12 个月到结束月”分隔这些总和。
- 月份显示该月的计数
- 迄今为止的合同就像 运行 从开始日期到结束日期的总数
- 财政年度从 6 月开始,就像 运行 总数一样,直到它到达下一年的 5 月,之后即将到来的 6 月将重置其计数
- 结束月份的 12 个月将前 11 个月添加到当前月份
结果会是
- 01/01/2015 10 月
- 01/02/2015 9 月
- 2015 年 1 月 3 日 12 月
- 01/04/2015 7 月
- 01/05/2015 8 月
- 01/06/2015 10 月
- 01/07/2015 10 月
- 01/08/2015 8 月
- 2015 年 1 月 9 日 9 月
- 01/10/2015 10 月
- 01/11/2015 11 月
- 2015 年 1 月 12 日 11 月
- 01/01/2015 10 合同
- 01/02/2015 19 合约至今
- 01/03/2015 31 合同
- 01/04/2015 39 合约至今
- 01/05/2015 47 合同
- 01/06/2015 57 合同
- 01/07/2015 67 合同
- 01/08/2015 75 合同
- 01/09/2015 84 合同
- 01/10/2015 94 合同
- 01/11/2015 105 份合同
- 01/12/2015 116 合同
- 等
我如何在单个查询中对这一切进行编程(无需创建 4 个单独的 tables) 我需要使用 SQL Server Management Studio 2008 或 2008r2 据我所知:
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 不支持 sum()
和 window 中的 order by
功能。尝试这样的事情
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)
最终结果:
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)