2

我面前有一个绝对莫名其妙的案子。我有两个数据库环境 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 上运行良好,但看起来好像 GROUP BY 子句在环境 B 中被完全忽略了。

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

我已经备份了 A 并将其恢复到 B,并且 SqlDelta(数据库的差异工具)显示数据库是相同的,所以它不是数据问题,它必须是配置问题 - 但我不知道在哪里看。

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

什么可能导致 SQL Server 不对该invoices.Amount字段进行分组?

4

3 回答 3

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
于 2009-06-04T17:53:36.107 回答
2

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

谢谢大家的建议:),但现在我有一个新问题:谁在微软杀了这个麻烦。

于 2009-06-04T18:37:48.467 回答
1

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

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

于 2009-06-04T18:05:47.537 回答