У меня есть несколько таблиц, к которым мне нужно присоединиться
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)
есть ли другой способ сделать это?