我面前有一个绝对莫名其妙的案子。我有两个数据库环境,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
字段进行分组?
答案 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()的结果。