您的查詢是不正確的,首先。
您並非按YEAR(Date)
和MONTH(Date)
分組,而是按字符串'Year'
和'Month'
分組。這就是你得到你的錯誤的原因。你如何解決它?
這很簡單。這是正確的查詢:
SELECT YEAR(Date) AS [Year], MONTH(Date) AS [Month], COUNT(DISTINCT [EmpID]) AS [EmpCount]
FROM [Logins].[dbo].[tblPortalLog]
GROUP BY YEAR(Date), MONTH(Date)
HAVING YEAR(Date) >= '2014';
如果你想美化這一點,讓你的別名使用,你可以用CROSS APPLY
以實現:
SELECT T.[Year], T.[Month], COUNT(DISTINCT [EmpID]) AS [EmpCount]
FROM [Logins].[dbo].[tblPortalLog]
CROSS APPLY (
SELECT YEAR(Date) AS [Year], MONTH(Date) AS [Month]
) AS T
GROUP BY T.[Year], T.[Month]
HAVING T.[Year] >= '2014';
你之所以不能在GROUP BY
和HAVING
子句使用別名是天然查詢處理順序,它是:
FROM
ON
OUTER
WHERE
GROUP BY
CUBE
| ROLLUP
HAVING
SELECT
DISTINCT
ORDER BY
TOP
你可以看到,SELECT
來GROUP BY
之後,而你恰好SELECT
語句創建別名,從而使他們在GROUP BY
無法使用。
感謝大家的回答!他們三人都工作得很好,產生了相同的數據,所以我把他們全部投了。我不想三次檢查,所以我只需要選擇第一個。Adam的速度也更快,這在數據表中非常受讚賞,其中有近千萬條記錄。 –