【问题标题】:SQL Count + Running Total in a single column单列中的 SQL 计数 + 运行总计
【发布时间】:2015-08-19 04:10:59
【问题描述】:

我对 SQL 还很陌生,所以请多多包涵。 我有一个包含日期列 (Date) 和计数列 (Count) 的表 (DataTable)

  • 01/01/2015 10
  • 01/02/2015 9
  • 01/03/2015 12
  • 01/04/2015 7
  • 01/05/2015 8
  • 01/06/2015 10
  • 01/07/2015 10
  • 01/08/2015 8
  • 01/09/2015 9
  • 01/10/2015 10
  • 01/11/2015 11
  • 2015 年 1 月 12 日 11 日

我需要创建一个新表来计算:计数、运行总计、运行财政年度、运行 12 个月。然后将这些全部添加到一个列中,并添加一个新的类别列,将这些总和按“月”、“合同日期”、“财政年度”和“12 个月到月底”分开。

  1. 月份显示该月的计数
  2. 截至日期的合同就像从开始日期到结束日期的总和
  3. 财政年度从 6 月开始,就像一个运行总计,直到它到达下一年的 5 月,之后即将到来的 6 月重置其计数
  4. 结束月份的 12 个月将前 11 个月添加到当前月份

结果是

  • 01/01/2015 10 个月
  • 01/02/2015 9 个月
  • 01/03/2015 12 个月
  • 01/04/2015 7 个月
  • 01/05/2015 8 个月
  • 01/06/2015 10 个月
  • 01/07/2015 10 个月
  • 01/08/2015 8 个月
  • 01/09/2015 9 个月
  • 01/10/2015 10 个月
  • 01/11/2015 11 个月
  • 01/12/2015 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 个单独的表) 我需要使用 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

标签: sql sql-server merge cumulative-sum


【解决方案1】:

我不认为 sql server 2008 在窗口函数中支持 sum()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) 

SQLFIDDLE DEMO

【讨论】:

  • 感谢工作,我已经设法在 12 个月内完成工作,但我似乎无法确定财政年度(澳大利亚从 6 月开始)
【解决方案2】:

最终结果:

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) 

【讨论】:

    猜你喜欢
    • 2021-12-20
    • 2023-03-23
    • 1970-01-01
    • 2023-04-04
    • 2010-10-26
    • 1970-01-01
    • 2013-01-17
    • 2015-02-09
    相关资源
    最近更新 更多