我有一个表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格式的定义
答案 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按月计算总和。
或者,您可以将分组分成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]