Внешнее Объединение с Группой - PullRequest
0 голосов
/ 16 мая 2018

У меня есть несколько таблиц, к которым мне нужно присоединиться

Customers (CustomerID int, CustomerName varchar(255))
Purchases (CustomerID int, PurchaseDate DateTime, Amt int)

Мой запрос что-то в этом роде

SELECT C.CustomerID, C.CustomerName, Year(P.PurchaseDate), Month(P.PurchaseDate), Sum(P.Amt)
FROM Customers C INNER JOIN Purchases P ON C.CustomerID = P.CustomerID
GROUP BY C.CustomerID, C.CustomerName, Year(P.PurchaseDate), Month(P.PurchaseDate)

результат примерно такой

CustomerID CustomerName Year Month Amt
1001       Tom          2018 04    200
1001       Tom          2018 01    100
1001       Tom          2017 10    300
1001       Tom          2017 08    400
1002       Matt         2018 03    150
1002       Matt         2018 02    250
1002       Matt         2017 11    350
1002       Matt         2017 08    450
1003       John         2018 04    105
1003       John         2018 03    205
1003       John         2018 02    305
1003       John         2017 12    405

Пока все в порядке

Но что я на самом деле хочу отображать все месяцы, даже если нет данных

CustomerID CustomerName Year Month Amt
1001       Tom          2018 04    200
1001       Tom          2018 03    0
1001       Tom          2018 02    0
1001       Tom          2018 01    100
1001       Tom          2017 12    0
1001       Tom          2017 11    0
1001       Tom          2017 10    300
1001       Tom          2017 09    0
1001       Tom          2017 08    400
1002       Matt         2018 04    0
1002       Matt         2018 03    150
1002       Matt         2018 02    250
1002       Matt         2018 01    0
1002       Matt         2017 12    0
1002       Matt         2017 11    350
1002       Matt         2017 10    0
1002       Matt         2017 09    0
1002       Matt         2017 08    450

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

DECLARE @Cal AS TABLE (CalYear int , CalMonth int)
INSERT INTO @Cal (CalYear, CalMonth)
VALUES(2018,4)

INSERT INTO @Cal (CalYear, CalMonth)
VALUES(2018,3)

INSERT INTO @Cal (CalYear, CalMonth)
VALUES(2018,2)

...

Проблема в том, что когда я присоединяюсь к @Cal в предыдущем запросе, у меня не все месяцы для каждого клиента !!

Я пробовал это

SELECT C.CustomerID, C.CustomerName, Year(P.PurchaseDate), Month(P.PurchaseDate), Sum(P.Amt)
FROM Customers C INNER JOIN Purchases P ON C.CustomerID = P.CustomerID
RIGHT OUTER JOIN @Cal L ON L.CalYear = Year(P.PurchaseDate) AND L.CalYear = Month(P.PurchaseDate)
GROUP BY C.CustomerID, C.CustomerName, Year(P.PurchaseDate), Month(P.PurchaseDate)

есть ли другой способ сделать это?

1 Ответ

0 голосов
/ 16 мая 2018

Попробуйте следующий запрос,

SELECT  C.CustomerID, C.CustomerName, L.CalYear, L.CalMonth, Sum(P.Amt)
FROM    Customers   C
    CROSS JOIN @Cal L
    LEFT OUTER JOIN Purchases P ON  C.CustomerID =  P.CustomerID
                                AND L.CalYear    =  Year(P.PurchaseDate) 
                                AND L.CalMonth    =  Month(P.PurchaseDate)
GROUP BY C.CustomerID, C.CustomerName, L.CalYear, L.CalMonth
...