2014-06-13 89 views
0

下面的查詢說,從託運人信息以及員工信息中查找訂單表中的託運人數量。sql groupby語句的概念

select Count(Shipper.ShipperID),Shipper.ShipperName from [Order] 
left join Shipper 
on 
[Order].ShipperID = Shipper.ShipperID 
group by ShipperID 

上面的查詢給出了groupby ShipperID上的錯誤。當我將其更改爲ShipperName時,它工作正常。 我得到的錯誤是:模糊列名'ShipperID'。

我需要理解爲什麼會發生這種情況?我無法理解w3schools或任何其他網站。

+0

兩個表[爲了]和[託運人]包含該領域的訂單,每個託運人shipperID「錯誤只是簡單地說明你希望按哪個表分組(可能是[shipper]。[shipperID] as [order]。[shipperID]可以爲null。但是這不會解決問題。select中的每個字段都不是part (計數,最大總和,min作爲示例)必須在分組中,如果在SQL服務器中存在聚合 – xQbert

回答

0

如果您正在尋找來算話,我建議你做這樣的事情

Select s.ShipperID, s.ShipperName, 
     (Select Count(1) From [Order] as o where o.ShipperId = s.ShipperId) as OrderCount 
from Shipper as s 
0
select Count(Shipper.ShipperID),Shipper.ShipperName from [Order] 
left join Shipper 
on [Order].ShipperID = Shipper.ShipperID 
group by Shipper.ShipperName 

當您在sql server的select語句中添加任何聚合函數時,Sql Server知道它需要對該查詢返回的所有行執行該聚合操作。

現在,當您在select查詢中添加另一個列名稱並且它不包含在任何聚合函數中時,只需使用它自己的列名稱即可。現在,Sql服務器需要知道在返回行時如何處理此列。

一個聚合函數擁有自己的代碼很簡單,直截了當sql服務器將簡單地對每行中從該查詢返回的所有值執行該操作,並返回具有標量值的單個行。

但是,如果在select語句中沒有包含在聚合函數中的其他列名稱,則會爲該列返回多行,現在如果sql server顯示第一列的SUM和第二列的所有行,將顯示不準確的結果。有SQL服務器拋出和錯誤,你將需要聚合由你的聚合函數調用的結果由沒有包含在任何聚合函數中的列。

您的查詢

如果僅選擇ShipperID的數量將返回顯示ShipperIDs的計數的整數讓說10,現在,當你在你的SELECT語句添加ShipperName,結果會顯示類似10爲計數列和第二列中的所有ShipperName,並且最終會在每個shipperName前面顯示類似於10,10,10的結果集,這將是錯誤的計數,顯然sql服務器不會執行此語句。

但是,如果您在select語句中添加GROUP BY ShipperName,則Count將不再爲每個ShipperName顯示10,但每個ShipperName的COUNT類似於1,3,4,2等等...... 我希望這會幫助你理解。 :)

+0

是的,但是爲什麼它通過ShipperID給出分組? –

0

嘗試通過ShipperName給人一種別名和組:因爲它不是在彙總條款

select Count(S.ShipperID),S.ShipperName from Order O 
left join Shipper S 
on 
O.ShipperID = S.ShipperID 
group by S.ShipperName 
0

錯誤不明確,是包括由於您在這兩個表中有ShipperId。如果您要將其更改爲Shipper.ShipperId,則最終會出現一個錯誤消息,指出Shipper.ShipperName未包含在聚合函數中,而我看不到需要您執行count()和group by柱。如果您有興趣爲每個Shipper id獲取一行,那麼您應該可以這樣做。

SELECT COUNT(不同Shipper.ShipperID),Shipper.ShipperName從[命令] 左連接託運人 上[訂購] .ShipperID = Shipper.ShipperID 組由發件人。ShipperName