我有两个查询:
select
CM.Month,
CM.Year
FROM CalendarMonths AS CM
上面的查询返回日历表中可用的所有月份和年份。
第二个查询如下:
select
DATEPART(month, T.Date) AS Month,
DATEPART(year, T.Date) AS Year,
ISNULL(SUM(Amount) ,0) As Total
from Transactions T
inner join TransactionClasses TC on TC.TransactionClassId = T.TransactionClassId AND T.TransactionClassId = 3
GROUP BY
DATEPART(month, T.Date),
DATEPART(year, T.Date)
这只是返回按月和年分组的属于特定事务类的事务的总数。上面的查询只返回实际包含事务的月份和年份的行。
我试图完成的是将这两个查询结合起来,以便除了返回包含事务的月份和年份的总数外,还返回其余月份的零总数。
到目前为止,我的尝试都没有成功,所以请帮助我将不胜感激。
您需要LEFT JOIN
到您的数据集。我会将您的第二个查询放入CTE/派生表中,这使得JOIN
更容易:
WITH Totals AS(
SELECT DATEPART(MONTH, T.Date) AS Month,
DATEPART(YEAR, T.Date) AS Year,
SUM(TC.Amount) AS Total
FROM dbo.Transactions T
INNER JOIN dbo.TransactionClasses TC ON TC.TransactionClassId = T.TransactionClassId
WHERE T.TransactionClassId = 3 --Moved from ON
GROUP BY DATEPART(MONTH, T.Date),
DATEPART(YEAR, T.Date))
SELECT CM.Month,
CM.Year,
ISNULL(T.Total,0) AS Total
FROM dbo.CalendarMonths CM
LEFT JOIN Totals T ON CM.Month = T.Month
AND CM.Year = T.Year;