2016-01-06 25 views
0

如何向運行總計的列添加以下已在日曆表上進行了左連接的查詢?優選地,該溶液應該具有良好的性能目標是SQL Server 2012.如何將SQL Server 2012中的日曆表中的左連接查詢添加到查詢中?

SELECT 
    calendar.year, calendar.month, 
    COUNT(users.ID) AS total_users 
FROM 
    core_Calendar AS calendar 
LEFT JOIN 
    users_Users AS users ON CONVERT(DATE, calendar.date) = CONVERT(DATE, users.CreatedAt) 
WHERE 
    calendar.year >= 2012 
    AND calendar.year <= Year({ts '2016-01-06 19:23:27'}) 
GROUP BY 
    calendar.year, calendar.month 
ORDER BY 
    calendar.year, calendar.month 
+0

基本上,您將需要使用ROW_NUMBER()分區功能。由於MONTH(calendar.date)在SELECT中不存在,因此查詢有問題,它應該拋出錯誤。在性能方面,當你將函數插入filter子句時,它們不是SARGABLE,這意味着它的執行計劃會很差,並且會導致輸出緩慢。 – VKarthik

+0

我刪除了MONTH(calendar.date)。這是多餘的,但沒有錯誤拋出。 – Thorsten

回答

0

當你說運行總數,我知道你指的是用戶數。 如果是這樣,請嘗試此查詢 -

SELECT 
    calendar.year, calendar.month, 
    SUM(isnull(users.ID),0) OVER PARTITION BY(calendar.year,calendar.month) AS total_users 
FROM 
    core_Calendar AS calendar 
LEFT JOIN 
    users_Users AS users ON CONVERT(DATE, calendar.date) = CONVERT(DATE, users.CreatedAt) 
WHERE 
    calendar.year >= 2012 
    AND calendar.year <= Year({ts '2016-01-06 19:23:27'}) 
GROUP BY 
    calendar.year, calendar.month 
ORDER BY 
    calendar.year, calendar.month