2012-04-16 49 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