单个列中的SQL Count + Running Total

时间:2015-08-19 04:10:59

标签: sql sql-server merge running-total

我对SQL很新,所以请耐心等待。 我有一个表(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
  • 01/12/2015 11

我需要创建一个新表来计算:计数,运行总计,运行财务年度,运行12个月。然后将这些全部添加到一个列中,并添加一个新的类别列,将这些总和分隔为“月份”,“合同到日期”,“财政年度”和#39;和#12个月结束月份#。

  1. 月份显示该月的计数
  2. 迄今为止的合同就像从开始日期到结束日期的运行总计
  3. 财政年度从六月份开始,就像一个总计一直到下一年的五月,之后即将到来的六月重新开始计算
  4. 12个月到月末将前11个月添加到当月
  5. 结果将是

    • 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
    

2 个答案:

答案 0 :(得分:2)

我不认为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

答案 1 :(得分:0)

最终结果:

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)