SUM YTD和MTD在同一查询中

时间:2014-08-26 08:22:25

标签: sql-server-2008

我有一个表TABLE1:

  Key     dt    category    AmtBC
 2475   201402  Penzijni    100,00
 2475   201403  Penzijni    100,00
 2475   201311  Retail     2056,00
 2475   201312  Retail     978,00
 2475   201406  Penzijni   100,00
 2475   201406  Retail     410,00
 2475   201401  Penzijni   100,00
 2475   201407  Retail     179,00
 2475   201404  Penzijni    100,00
 2475   201405  Penzijni    100,00
 2475   201407  Penzijni    100,00
 2475   201401  Retail      1377,00
 9628   201404  Penzijni    500,00
 9628   201405  Penzijni    500,00
 9628   201402  Penzijni    500,00
 9628   201406  Penzijni    500,00
 9628   201401  Penzijni    500,00
 9628   201407  Penzijni    500,00
 9628   201403  Penzijni    500,00

我需要按照Dt和类别对每个Key,group的AmtBC求和。但我需要将Penzijni类别计为MTD,将零售计算为YTD。

所以当我这样做时:

SELECT 
    KEY
    , Dt
    , SUM(CASE 
            WHEN category = 'Penzijni'
              THEN AmtBC
            ELSE 0
          END) AS Penzijni
    , SUM(CASE 
            WHEN category = 'Retail'
              THEN AmtBC
          ELSE 0
          END) AS Retail
FROM TABLE1
GROUP BY KEY, dt

它给了我飞蛾的总和,但我需要在同一个查询中向SUM Penzijni现在(每月),但按年份零售,这意味着每年的SUM,如下:

Key    Dt    category    AmtBC
2475  201311  Retail         3034
2475  201312  Retail         3034
2475  201401  Retail         2066
2475  201406  Retail         2066
2475  201407  Retail         2066  

提前谢谢

已编辑:我更改了YTD格式的定义

1 个答案:

答案 0 :(得分:0)

试试这个:

SELECT 
[KEY]
, Dt
, SUM(CASE 
        WHEN category = 'Penzijni'
          THEN AmtBC
        ELSE 0
      END)  OVER (PARTITION BY [key], dt order by dt) AS Penzijni
, SUM(CASE 
        WHEN category = 'Retail'
          THEN AmtBC
      ELSE 0
      END)  OVER (PARTITION BY [key], left(dt,4) order by dt) AS Retail
FROM table1

我们的想法是将SUM函数与OVER子句一起使用,然后将源数据集按月或年分区。这为我们提供了更大的灵活性,我们可以为2个类别指定单独的分组标准,即按零售年份和Penzijni按月计算总和。

Demo

或者,您可以将分组分成2个查询,然后根据密钥加入,如下所示:

;with retail as
(SELECT [key], left(Dt,4) y, SUM(CASE WHEN category = 'Retail' THEN AmtBC ELSE 0 END) Retail
FROM tbl
GROUP BY [KEY], left(dt,4)),

penzijni as
(SELECT [key], Dt m,SUM(CASE WHEN category = 'Penzijni' THEN AmtBC ELSE 0 END) Penzijni
FROM tbl
GROUP BY [KEY], dt)

select p.[key], p.m Dt, r.Retail, p.Penzijni from
retail r 
inner join penzijni p on r.[key] = p.[key]

Demo