2012-04-16 31 views
0

我想從運行在Win2000服務器上的老數據庫中提取一些數據SQL Server 2000 v8.00.760,但出現錯誤。我的查詢是在我正在使用的當前數據庫中工作,但我不知道我在做什麼,如果這是問題,那麼這是不可逆的。查詢在MySQL 5.1但不在SQL2000中起作用

這裏是我的查詢:

SELECT o.CustomerID, o.ShipName, o.ShipCity, o.ShipStateOrProvince, o.ShipPostalCode, o.ShipPhoneNumber, c.Profession, SUM(o.Total) 
FROM Orders o 

JOIN Customers c ON o.CustomerID = c.CustomerID 

WHERE (o.OrderDate >= '2012-01-01') 
AND (o.Void <> - 1) 
AND (o.Cancelled <> - 1) 

GROUP BY o.CustomerID 

在MySQL中它的正常工作。我以我想要的方式返回查詢。但我得到錯誤...

當我在較舊的SQL版本中嘗試它。

我現在有點迷路了。誰能告訴我我做錯了什麼?

謝謝!

回答

3

SQL服務器關於GROUP BY比MySQL更嚴格。 SELECT子句中的所有非聚合列也必須出現在GROUP BY中。這避免了在給定CustomerID存在多個ShipName值時可能出現的歧義。雖然MySQL會隨意選擇一個,但SQL Server會強制您將它們視爲單獨的行。

SELECT o.CustomerID, o.ShipName, o.ShipCity, o.ShipStateOrProvince, o.ShipPostalCode, o.ShipPhoneNumber, c.Profession, SUM(o.Total) 
FROM Orders o 

JOIN Customers c ON o.CustomerID = c.CustomerID 

WHERE (o.OrderDate >= '2012-01-01') 
AND (o.Void <> - 1) 
AND (o.Cancelled <> - 1) 

GROUP BY o.CustomerID, o.ShipName, o.ShipCity, o.ShipStateOrProvince, o.ShipPostalCode, o.ShipPhoneNumber, c.Profession 
+0

哦!我明白了,謝謝你的解釋。 – Monty 2012-04-16 19:02:37

2

SQL服務器要求每個字段包含在您SELECT被包含在一個GROUP BY條款時,有一個聚合函數,所以你必須給所有字段添加到您的GROUP BY

SELECT o.CustomerID 
    , o.ShipName 
    , o.ShipCity 
    , o.ShipStateOrProvince 
    , o.ShipPostalCode 
    , o.ShipPhoneNumber 
    , c.Profession 
    , SUM(o.Total) 
FROM Orders o 
JOIN Customers c 
    ON o.CustomerID = c.CustomerID 
WHERE (o.OrderDate >= '2012-01-01') 
    AND (o.Void <> - 1) 
    AND (o.Cancelled <> - 1) 
GROUP BY o.CustomerID 
    , o.ShipName 
    , o.ShipCity 
    , o.ShipStateOrProvince 
    , o.ShipPostalCode 
    , o.ShipPhoneNumber 
    , c.Profession