计算每个项目组的月数
Count the number of months per item group
我有一个 table 带有 ItemID、Qty 和 OrderDate
我只查询订单日期介于下个月(当前月份 + 1)和之后 11 个月之间的结果。
我正在尝试编写一个查询,通过 ItemID 获取 QTY 的总和,以及每个 ItemID 存在的月数。
我可以得到如下所示的结果集:
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
我通过对 ITEMID、MONTH(OrderDate)、YEAR(OrderDate) 进行分组得到这个,它显示了每个 month/year 的总数。本例中共有 9 个月。但是,您会看到每个项目及其关联的 month/year 都重复此操作,如果存在订单,则可能是 1 到 11。
我需要一个如下所示的结果集:
ITEMID Qty MnthCount
01.0002 4704.00 9
A0-B1002 3300.00 2
ZX-YT12 50.00 7
我认为必须有一些 Window 功能或我可以使用的东西。有没有办法做到这一点,或者我是否需要求助于子选择或某种外部应用?
将来,如果您在问题中包含一些示例数据(几十行)以及基于此示例数据的预期结果,那么回答此类问题会容易得多。
有很多方法可以做到。这是一种变体。
由于结果集中每个 ItemID
需要一行,因此我们应该按 ItemID
分组。 Qty
的总和很简单。
要计算月份,先做一点变换。
DATEDIFF(month, '2001-01-01', OrderDate)
returns 自某个锚定日期以来经过的月数。您可以选择该月的任何其他第一天而不是 2001-01-01
。 COUNT(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
;
你喜欢这个吗?
---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
*/
我有一个 table 带有 ItemID、Qty 和 OrderDate
我只查询订单日期介于下个月(当前月份 + 1)和之后 11 个月之间的结果。
我正在尝试编写一个查询,通过 ItemID 获取 QTY 的总和,以及每个 ItemID 存在的月数。
我可以得到如下所示的结果集:
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
我通过对 ITEMID、MONTH(OrderDate)、YEAR(OrderDate) 进行分组得到这个,它显示了每个 month/year 的总数。本例中共有 9 个月。但是,您会看到每个项目及其关联的 month/year 都重复此操作,如果存在订单,则可能是 1 到 11。
我需要一个如下所示的结果集:
ITEMID Qty MnthCount
01.0002 4704.00 9
A0-B1002 3300.00 2
ZX-YT12 50.00 7
我认为必须有一些 Window 功能或我可以使用的东西。有没有办法做到这一点,或者我是否需要求助于子选择或某种外部应用?
将来,如果您在问题中包含一些示例数据(几十行)以及基于此示例数据的预期结果,那么回答此类问题会容易得多。
有很多方法可以做到。这是一种变体。
由于结果集中每个 ItemID
需要一行,因此我们应该按 ItemID
分组。 Qty
的总和很简单。
要计算月份,先做一点变换。
DATEDIFF(month, '2001-01-01', OrderDate)
returns 自某个锚定日期以来经过的月数。您可以选择该月的任何其他第一天而不是 2001-01-01
。 COUNT(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
;
你喜欢这个吗?
---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
*/