【问题标题】:Count the number of months per item group计算每个项目组的月数
【发布时间】:2018-12-14 01:14:48
【问题描述】:

我有一个包含 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) 分组来获得此信息,它显示了每个月/年的总数。在这个例子中总共有 9 个月。但是,您会看到每个项目都重复此操作,并且其关联的月/年(如果存在订单)可能是 1 到 11。

我需要一个如下所示的结果集:

ITEMID      Qty        MnthCount
01.0002     4704.00     9
A0-B1002    3300.00     2
ZX-YT12       50.00     7

我认为必须有一些窗口功能或我可以使用的东西。有没有办法做到这一点,还是我需要求助于子选择或某种外部应用?

【问题讨论】:

  • 底层数据是什么样的?你愿意分享你的查询吗?
  • 嗯,它非常简单,ItemID、Qty 和 OrderDate 示例数据如下所示:AX09-1 5 3/15/2018 Z7-HJk 4 3/01/2018 等等

标签: sql sql-server tsql window-functions


【解决方案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
*/

【讨论】:

    【解决方案2】:

    对于未来,如果您在问题中包含一些示例数据(几十行)以及基于此示例数据的预期结果,那么回答此类问题会变得更加容易。


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

    由于结果集中每个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
    ;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-07
      • 2018-06-22
      • 2011-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-12
      相关资源
      最近更新 更多