计算每个项目组的月数

时间:2018-12-14 01:14:49

标签: sql sql-server tsql window-functions

我有一个表,其中包含ItemID,Qty和OrderDate

我只查询订购日期在下个月(当月+ 1)至此后11个月之间的结果。

我正在尝试编写一个查询,该查询通过ItemID来获取QTY的总和,以及每个ItemID所存在的月数。

我可以得到一个看起来像这样的结果集:

from

我通过将ITEMID,MONTH(OrderDate),YEAR(OrderDate)分组来获得此数据,它显示了每个月/年的总数。此示例总共有9个月。不过,您会看到每个项目都重复此操作,以及与之相关的月/年(如果有订单,则可能是1到11)。

我需要一个看起来像这样的结果集:

ITEMID  Qty    TMonth   TYear
01.0002 392.00    1      2019
01.0002 392.00    2      2019
01.0002 392.00    3      2019
01.0002 784.00    4      2019
01.0002 784.00    5      2019
01.0002 392.00    6      2019
01.0002 784.00    7      2019
01.0002 392.00    8      2019
01.0002 392.00    9      2019

我认为必须有一些Window Function或我可以使用的东西。有没有办法做到这一点,还是我需要求助于Sub-Selects或某种外部申请?

2 个答案:

答案 0 :(得分:1)

您想要这个吗?

---drop table test 
create table test 
(ITEMID varchar(20),
Qty decimal(10,2),
TMonth  int, 
TYear int)
insert into test values 
('01.0002',392.00,1,2019),
('01.0002',392.00,2,2019),
('01.0002',392.00,3,2019),
('01.0002',784.00,4,2019),
('01.0002',784.00,5,2019),
('01.0002',392.00,6,2019),
('01.0002',784.00,7,2019),
('01.0002',392.00,8,2019),
('01.0002',392.00,9,2019),
('A0-B1002',300.00,8,2019),
('A0-B1002',3000.00,9,2019),
('ZX-YT12',5.00,1,2019),
('ZX-YT12',5.00,2,2019),
('ZX-YT12',5.00,3,2019),
('ZX-YT12',5.00,4,2019),
('ZX-YT12',5.00,5,2019),
('ZX-YT12',5.00,6,2019),
('ZX-YT12',20.00,7,2019)

select ITEMID,sum(Qty) as Qty, count(TMonth) as MnthCount
from test  group by ITEMID
/*
ITEMID               Qty                                     MnthCount
-------------------- --------------------------------------- -----------
01.0002              4704.00                                 9
A0-B1002             3300.00                                 2
ZX-YT12              50.00                                   7
*/

答案 1 :(得分:0)

将来,如果您将一些示例数据(几十行)与基于此示例数据的预期结果一起添加到问题中,则回答此类问题将变得更加容易。


有很多方法可以做到这一点。这是一个变种。

由于结果集中的每个ItemID需要一行,因此我们应按ItemID分组。 Qty的总和很简单。

要计算月份,请先进行一些转换。

DATEDIFF(month, '2001-01-01', OrderDate)

返回自某个锚定日期以来经过的月数。您可以选择每月的其他任何第一天而不是2001-01-01COUNT(DISTINCT)将计算所有唯一值。

最终查询:

SELECT
    ITEMID
    ,SUM(Qty) AS TotalQty
    ,COUNT(DISTINCT DATEDIFF(month, '2001-01-01', OrderDate)) AS MonthCount
FROM
    YourTable
WHERE
    OrderDate >= @StartDate
    AND OrderDate < @EndDate
GROUP BY
    ITEMID
;