2012-03-04 82 views
3

我對SQL Server非常沮喪。我只是試圖加入3個表格,非常簡單,並且很容易在mysql中完成。但在SQL Server中,它一直告訴我在集合函數中包含tbl_department.deptname。但是,我可能在一個簡單的字符串中使用什麼聚合函數?SQL Server中的聚合函數

SELECT  
    COUNT(tblStudent_Department.student_id) AS Expr2, 
    tbl_department.deptname AS Expr1 
FROM   
    tblStudent_Department 
LEFT OUTER JOIN 
    tbl_department ON tblStudent_Department.deptcode = tbl_department.deptcode 
LEFT OUTER JOIN 
    tblStudent ON tblStudent_Department.student_id = tblStudent.studentid 
GROUP BY 
    tblStudent_Department.deptcode 

請幫忙。

回答

7

該數據庫不知道,如果你在deptcode上進行分組,你隱式分組在deptname。你必須通過添加列到group by告訴SQL服務器這樣的:

GROUP BY tblStudent_Department.deptcode, tbl_department.deptname 

MySQL是特殊,因爲它基本上採排隨機,如果你不指定的集合。這可能會產生誤導,並導致錯誤的結果。與其他許多事情一樣,MySQL有更實用的解決方案,而SQL Server則更爲正確。

0

首先,最後,或者把它放到組中。

的規則是:

  • 如果您使用GROUP BY,每場分組字段的任何一個或聚集的領域之一。

如果您選擇了tbl_department.deptname,那麼您也必須按這個方法進行分組,或者說說做了哪一個。

一些aggretgate功能很好地僞裝 - 首先,最後(採取第一次或最後一次發生)。

+2

我上次檢查時,SQL Server不支持'first()'或'last()'聚合?這不是Oracle/Postgres嗎? – Andomar 2012-03-04 13:29:18

1

問題是因爲您的GROUP BYSELECT條款不匹配。

解決這個問題的最簡單的方法是添加tbl_department.deptname到您GROUP BY,像這樣:

GROUP BY tblStudent_Department.deptcode, tbl_department.deptname 
1

你DEPTCODE通過分組而是選擇DEPTNAME - 如果你不想聚集部(其聽起來很有道理),那麼你需要「按組」語句必須在該DEPTNAME:

SELECT COUNT(tblStudent_Department.student_id) AS Expr2, tbl_department.deptname AS Expr1 
FROM tblStudent_Department 
    LEFT OUTER JOIN tbl_department ON tblStudent_Department.deptcode = tbl_department.deptcode 
    LEFT OUTER JOIN tblStudent ON tblStudent_Department.student_id = tblStudent.studentid 
GROUP BY tblStudent_Department.deptname 

注意我已經刪除了,因爲DEPTCODE我不認爲你需要它

如果您使用聚合函數(總和,計數等),則select語句中返回的所有字段都需要在group by子句中進行聚合或進行聚合。