关于sql server:SQL Count Running Total in a single column

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 个月到月底"分开。

  • 月份显示该月的计数
  • 迄今为止的合同就像从开始日期到结束日期的运行总计
  • 财政年度从 6 月开始,就像一个运行总计,直到它到达下一年的 5 月,之后即将到来的 6 月重置其计数
  • 到月底的 12 个月将前 11 个月添加到当前月份
  • 结果将是

    • 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 在窗口函数中支持 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 演示


    最终结果:

    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)