分组条款在一个环境中工作,而不是另一个环境

时间:2009-06-04 17:33:06

标签: sql-server group-by

我面前有一个绝对莫名其妙的案子。我有两个数据库环境,A和B,其中环境B是从A的备份创建的。我正在运行一个相当简单的查询:

SELECT
    customers.customerName           (* varchar(100), not null *)
    ,countries.countryName           (* varchar(100), not null *)
    ,Balance = Sum(invoices.Amount)  (*        money, not null *)
FROM invoices
INNER JOIN customers
    ON customers.customerID = invoices.customerID
INNER JOIN countries
    ON countries.countryID = customers.countryID
GROUP BY
    customers.customerName
    ,countries.countryName
HAVING
    Sum(invoices.Amount) <> 0
ORDER BY
    customers.customerName

查询返回发票上余额为非零的用户列表。环境A的结果类似于以下内容:

customerName        countryName        Balance
------------        -----------        -------
A                   United States       20.0000
B                   United States       -5.0000
C                   Canada             199.9900
D                   Canada              -0.0100
E                   United States       55.5900

环境B的结果如下:

customerName        countryName        Balance
------------        -----------        -------
A                   United States       10.0000
A                   United States       -5.0000
A                   United States       -1.0000
A                   United States       17.0000
A                   United States       -1.0000
B                   United States       -1.0000
B                   United States       -4.0000
C                   Canada             100.9900
C                   Canada              99.9900
...

查询在环境A上工作正常,但看起来好像在环境B中完全忽略了GROUP BY子句。

当我从SELECT和HAVING子句中注释掉Sum(invoices.Amount)时,查询按预期工作,因此它肯定与我的invoices.Amount字段相关联。

我已备份A并将其恢复到B,而SqlDelta(数据库的差异工具)显示数据库是相同的,因此它不是数据问题,它必须是配置问题 - 但我没有想法在哪里看。

如果相关,两个环境都在Windows Server 2003上使用SQL Server 2000.两个环境都安装在两个单独的服务器上,单独的SQL Server实例和Windows Server 2003的单独实例。

什么可能导致SQL服务器不对invoices.Amount字段进行分组?

3 个答案:

答案 0 :(得分:3)

尝试此查询以尝试以更简单的形式重现问题:

SELECT customerName, Count(*)
FROM customer
GROUP BY customerName
ORDER BY customerName

尝试此查询以检查在客户名称中尾随空格的可能性,作为分组不同的原因。

SELECT customerName, Count(*)
FROM
(
SELECT '|' + customerName + '|' as customerName
FROM customer
) as sub
GROUP BY customerName
ORDER BY customerName

答案 1 :(得分:2)

事实证明查询没有错误,这是一个环境问题。环境A有SQL Server 8.0.2039,其中环境B有SQL Server 8.0.1053。我已使用最新的Service Pack更新了环境B,现在我的查询按预期工作。

感谢大家的建议:),但现在我遇到了一个新问题:谁会因为这个麻烦而杀死微软。

答案 2 :(得分:1)

如果注释掉HAVING子句会发生什么,但是在SELECT子句中保留Sum(invoices.Amount)?即你能验证sum()函数是否正常工作?

此外,您可以检查数据库排序规则(或默认服务器排序规则);整理设置会影响某些聚合函数,但不可否认,我不明白为什么它会改变sum()的结果。