Подсчитайте количество месяцев на группу товаров - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть таблица с ItemID, Qty и OrderDate

Я запрашиваю только результаты с датой заказа между следующим месяцем (текущий месяц + 1) и 11 месяцами после этого.

Я пытаюсь написать Запрос, который возвращает мне СУММУ КОЛИЧЕСТВА по ItemID и СЧЕТ МЕСЯЦЕВ, которые существуют для каждого 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

Я полагаю, что должна быть какая-то оконная функция или что-то, что я могу использовать.Есть ли способ сделать это, или мне нужно прибегнуть к Sub-Selects или какой-то Outer Apply?

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

Хотели бы вы этого?

---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
*/
0 голосов
/ 14 декабря 2018

В будущем будет гораздо легче ответить на такие вопросы, если вы включите в вопрос некоторые примерные данные (несколько десятков строк) вместе с ожидаемым результатом, основанным на этих выборочных данных.


Есть много способов сделать это.Вот один из вариантов.

Так как вам нужна одна строка на ItemID в наборе результатов, мы должны сгруппировать по ItemID.Сумма Qty проста.

Для подсчета месяцев сначала нужно немного преобразовать.

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

возвращает количество месяцев, прошедших с некоторой даты привязки.Вы можете выбрать любой другой 1-й день месяца вместо 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
;
...