今天用SQL Server嘗試實現一個SQL語句的時候,報了如標題所示的錯誤,通過在百度里面搜索,並親自動手實現,終於發現問題所在,現在把它記錄下來。
語句如下:
select [OrderID],[ProductID], min(UnitPrice) as MinUnitPrice into NewDetails FROM [Northwind].[dbo].[Order Details] Group by [OrderID]
執行該語句之后,SQL Server報錯如下:
“消息 8120,級別 16,狀態 1,第 1 行選擇列表中的列 'Northwind.dbo.Order Details.ProductID' 無效,因為該列沒有包含在聚合函數或 GROUP BY 子句中。”
正確的語句應該是這樣的:
select [OrderID],[ProductID], min(UnitPrice) as MinUnitPrice into NewDetails FROM [Northwind].[dbo].[Order Details] Group by [OrderID],[ProductID]
之所以應該這樣寫,是由Group By子句決定的。下面是從MSDN中找到的關於Group By的一些知識。
Group的作用:
指定由查詢表達式(Select)返回的對象要分入的組。
[ GROUP BY aliasedExpression [ ,... n ] ]
參數:
aliasedExpression
要對其執行分組的任何有效查詢表達式。expression可以是屬性或者是引用 FROM 子句所返回的屬性的非聚合表達式。 GROUP BY 子句中的每一個表達式的求值結果必須為可比較相等性的類型。這些類型通常為標量基元類型,如數字、字符串和日期。不可按集合分組。備注:
如果 SELECT 子句 <select list> 中包含聚合函數,則 GROUP BY 將計算每個組的匯總值。指定 GROUP BY 時,選擇列表中任何非聚合表達式內的每個屬性名都應包含在GROUP BY列表中,或者GROUP BY表達式必須與選擇列表表達式完全匹配。
使用Group By子句的時候,一定要記住下面的一些規則:
(1)不能Group By非標量基元類型的列,如不能Group By text,image或bit類型的列;
(2)Select指定的每一列都應該出現在Group By子句中,除非對這一列使用了聚合函數;
(3)不能Group By在表中不存在的列;
(4)進行分組前可以使用Where子句消除不滿足條件的行;
(5)使用Group By子句返回的組沒有特定的順序,可以使用Order By子句指定次序。