2009-06-04 7 views
2

私はまったく困惑しています。グループバイダル句は1つの環境で動作しますが、別の環境では動作しません。

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 

クエリが非を持っているユーザーのリストを返します。私は環境Bは、私はむしろ単純なクエリを実行しているA.のバックアップから作成された2つのデータベース環境では、AとBを、持っています請求書の残高ゼロ。環境Aからの結果は、次の似ている次のように環境Bの

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 

結果は以下のとおりです。

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句が中であるかのように見えます

SELECTとHAVING句からSum(invoices.Amount)をコメントアウトすると、クエリは正常に機能します。したがって、そのクエリは確実にinvoices.Amountフィールドに接続されています。

私はAをバックアップしてBに復元しました.SqlDelta(データベースの差分ツール)は、データベースが同一であることを示しています。データの問題ではなく、設定上の問題です。どこを見るか分かりません。場合

その関連、両方の環境では、両方の環境は二つの別々のサーバ、SQL Serverの別々のインスタンス、およびWindows Server 2003

の別々のインスタンスにインストールされているWindows Server 2003でSQL Server 2000を使用していますSQLサーバーがinvoices.Amountフィールドをグループ化しない原因となるのは何ですか?

+0

私はあなたの時間を無駄にしていると思うので、これは推測です。接続設定を確認できますか?ansi_nullsはオンになっていますか? – u07ch

+0

これは本当に全体のクエリですか?それはおそらく大きなクエリの一部ですか? – RBarryYoung

+0

SQL ServerとSPのどのバージョンですか? – RBarryYoung

答えて

2

クエリにエラーはありませんでしたが、環境に問題がありました。環境AにSQL Server 8.0.2039がありました。環境BにはSQL Server 8.0.1053があります。私は最新のサービスパックで環境Bを更新しました。そして、私のクエリは期待どおりに動作します。

あなたの提案に感謝します:)しかし、今私は新しい問題を抱えています。誰がこの面倒をMicrosoftに殺すか。

+0

なぜそれらを殺す? SQL 2000は迷惑メールです。2005年または2008年のリソースを取得する必要があります。 – DForck42

+0

渇きの人:大好き!私たちが社内で開発したものはすべて2005年に完成しましたが、2000年に縛られているサードパーティのベンダーに依存しています。 – Juliet

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

HAVING句をコメント化しても、SELECT句にSum(invoices.Amount)を残した場合はどうなりますか?つまり、sum()関数が機能していることを確認できますか?

また、データベース照合(またはデフォルトのサーバー照合)を確認することもできます。照合設定はいくつかの集計関数に影響する可能性がありますが、確かに、なぜsum()の結果が変わるのかわかりません。

+0

IT WORKS!したがって、HAVING句が問題の原因になっています。そうでない場合は、2つのサーバー間のデフォルトの照合は同じです。これまで気づいたはずですが、環境AにはSQL Server 8.0.2039があり、環境BにはSQL Server 8.0.1053があります。私はいくつかのサービスパックをインストールしていないように見えます - 私はそのショットを与え、何が起こるか見るでしょう。 – Juliet

+0

ハ!バージョン番号の把握8.00.2039はSP4なので、少なくともあなたの2番目の環境では簡単に適用できます。 – Matt

関連する問題