Как получить сумму двух количественных столбцов на основе разных условий группировки? - PullRequest
0 голосов
/ 03 июля 2019

Table1 Table2

Из внутреннего объединения таблиц1 и таблиц2, соединенных при доставке, я хочу получить сумму qty_to_ship, основанную на группировке завода, деталей и exp_ship_date, и сумму qty_shipped, основанную на группировке завода, деталей и book_date. Идея состоит в том, чтобы рассчитать количество отгруженных товаров на основе даты_базы и количества, отгруженной на основе даты_экспозиции.

Я пытался использовать подзапрос, но не мог получить правильные ответы

что я пробовал

DECLARE @REPORT AS NVARCHAR(50)='2019-06-19 00:00:00.000'
SELECT
    PLANT,
    PARTS,
    YEAR(P_DATE) AS P_DATE,MONTH(P_DATE) AS P_DATE,DAY(P_DATE) AS P_DATE,
    ES_DATE AS ES_DATE,
    SUM(CASE WHEN (P_DATE<@REPORT AND P_DATE > DATEADD(DAY,-7,@REPORT)) THEN QTY_PICKED ELSE 0 END) AS SHIPPED,
    SUM(CASE WHEN ES_DATE>@REPORT AND ES_DATE < DATEADD(DAY,7,@REPORT) THEN QTY_MII ELSE 0 END) -SUM(CASE WHEN ES_DATE>@REPORT AND ES_DATE < DATEADD(DAY,7,@REPORT) THEN QTY_PICKED ELSE 0 END)  AS TO_SHIP
      FROM TABLE1 T1
      INNER JOIN
      TABLE2 T2 
      ON
      T1.DELIVERY = T2.DELIVERY

WHERE PLANT = 'XXX'
GROUP BY
    GROUPING SETS (
        (PLANT, PARTS,YEAR(P_DATE),MONTH(P_DATE),DAY(P_DATE)),
        (PLANT, PARTS,ES_DATE)
    )
ORDER BY
PLANT,
PARTS

1 Ответ

0 голосов
/ 03 июля 2019

Вы можете использовать предложение OVER для вычисления агрегации на основе различных группировок для каждой строки:

SELECT *
     ,SUM(qty_to_ship) OVER (PARTITION BY plant, parts, exp_ship_date)
     ,SUM(qty_shipped) OVER (PARTITION BY plant, parts, book_date)
FROM table1 A
INNER JOIN table2 B
    ON A.[Delivery] = B.[Delivery];

, затем оставьте нужные столбцы и используйте DISTINCT, чтобы удалить дублирующиеся строки.Например:

SELECT DISTINCT A.develiery
               ,A.plant
               ,A.parts
               ,SUM(qty_to_ship) OVER (PARTITION BY plant, parts, exp_ship_date)
               ,SUM(qty_shipped) OVER (PARTITION BY plant, parts, book_date)
FROM table1 A
INNER JOIN table2 B
    ON A.[Delivery] = B.[Delivery];
...