2015-10-26 28 views
0

我有一個日期,員工編號登錄表。我需要的是有多少獨特的員工登錄有,每月和每年的計數,用於在2014年語法錯誤與GROUP,DISTINCT和HAVING

開始登錄這是據我已經能夠得到:

SELECT YEAR(Date) AS 'Year', MONTH(Date) AS 'Month', COUNT(DISTINCT EmpID) AS EmpCount 
FROM [Logins].[dbo].[tblPortalLog] 
GROUP BY 'Year', 'Month' 
having 'Year' >= '2014'; 

...但我得到錯誤:「每個GROUP BY表達式必須至少包含一個不是外部引用的列。」

我GOOGLE了這個錯誤,但我還是一直無法弄清楚如何更改SQL讓我得到我想要的東西。

+0

感謝大家的回答!他們三人都工作得很好,產生了相同的數據,所以我把他們全部投了。我不想三次檢查,所以我只需要選擇第一個。Adam的速度也更快,這在數據表中非常受讚賞,其中有近千萬條記錄。 –

回答

1

您應該使用雙引號或[],而不是單引號括起來的別名(編輯:在having子句中)。單引號表示字符串值。另外,爲了便於攜帶,您應該使用實際表達式而不是組中的別名。

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' 

而且作爲另一個答案注意到,您的情況可能應該是WHERE條款,而不是HAVING英寸另外,比較原始日期的可能性更快。

SELECT YEAR(Date) AS [Year], MONTH(Date) AS [Month], COUNT(DISTINCT EmpID) AS EmpCount 
FROM [Logins].[dbo].[tblPortalLog] 
WHERE Date >= '20140101' 
GROUP BY YEAR(Date), MONTH(Date) 
+0

將where子句更改爲:Where Date> ='20140101'和Date <'20150101' –

+0

@Gastros如果該列上有索引 - 那麼是的。 –

+0

@EvaldasBuinauskas即使現在沒有索引,也可能有一天。 –

1

首先,使用「where子句」只處理您需要的數據。
然後,使用「group by子句」的時候,你不能指的是出現在「選擇條款」列別名。你必須重複這個公式。在這種情況下,公式爲「年(日期)」。

SELECT Year  = YEAR([Date]), 
     Month = MONTH([Date]), 
     EmpCount = COUNT(DISTINCT EmpID) 
FROM [Logins].[dbo].[tblPortalLog] 
WHERE YEAR([Date]) >= 2014 
GROUP BY YEAR([Date]), 
      MONTH([Date]) 

N.B:我在日期周圍添加了方括號,因爲它是一個保留的世界。

1

您的查詢是不正確的,首先。

您並非按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 BYHAVING子句使用別名是天然查詢處理順序,它是:

  1. FROM
  2. ON
  3. OUTER
  4. WHERE
  5. GROUP BY
  6. CUBE | ROLLUP
  7. HAVING
  8. SELECT
  9. DISTINCT
  10. ORDER BY
  11. TOP

你可以看到,SELECTGROUP BY之後,而你恰好SELECT語句創建別名,從而使他們在GROUP BY無法使用。