2009-07-08 21 views
1

いくつかの詳細レコードのいくつかのフィールドの合計がヘッダーレコードの合計フィールドと等しいかどうかを確認するSQLサーバー2005のクエリを作成しようとしています。これは私が働いている会社の小切手の電子デポジットの作成に使用されます。SQL Server 2005の集計クエリ

階層は次のようになります。 - >バッチ - 預金電子預金のためのファイルを作成する前に>をチェック

、複製は完全に各テーブルに完了していない可能性がありますので、私はあることを確認するためにチェックする必要がありますファイルを作成する前に各レコードがそこにあります。基本的には、適切なバッチ数と正しい数のチェックがそれぞれのテーブルに存在する、DepositテーブルからロケーションとIDのリストを選択したいと思います。

ここに私が持っている論理があります。

select location, d.id from closing_balance..cb_deposits as d 
left outer join closing_balance..cb_checkbatchhf as b on d.id = b.deposit_id and d.location = b.loc 
left outer join closing_balance..cb_checkdf as c on b.id = c.batch_id and b.loc = c.loc 
where sum(c.check_amt) = b.scanned_subtotal and sum(b.scanned_subtotal) = d.amount and sum(b.num_checks_scanned) = d.count 

where節に集計関数の合計を入れることができないため、上記は機能しません。私はこれをプログラム的に簡単に行うことができますが、SQL文でこれをすばやく行う巧妙な方法があれば、それが最適です。

ご協力いただきまして誠にありがとうございます。

ありがとうございます!

+0

覚えておいてください:WHERE - 考慮事項から行を削除し、残りの行をグループ化し、HAVINGはグループを削除します –

答えて

4

のためにあなたは、having句にあなたのサムチェックを移動することができます!確かに、これはレコード数のチェックを回避する代わりにアドレッシングを必要とする問題です。

どのようにデータを複製していますか?

+0

ありがとうございます。これはうまくいった。 – Aaron

1

WHERE句では合計を実行できませんが、HAVING句を使用できます。

select location, d.id 
from closing_balance..cb_deposits as d 
left outer join closing_balance..cb_checkbatchhf as b 
    on d.id = b.deposit_id and d.location = b.loc 
left outer join closing_balance..cb_checkdf as c 
    on b.id = c.batch_id and b.loc = c.loc 
group by location, d.id, b.scanned_subtotal, d.amount, d.count 
having sum(c.check_amt) = b.scanned_subtotal 
    and sum(b.scanned_subtotal) = d.amount 
    and sum(b.num_checks_scanned) = d.count 
1

複製、完全に各テーブルのために完了していない可能性があります:句は後に例

SELECT 
    Id 
FROM 
    Table 
GROUP BY 
    Id 
HAVING 
    SUM(Amount) = 100 
+0

私は同意しません。ファイルを生成する中央の場所にデータを複製する38の場所があります。ネットワークエラーが発生した場合、またはレイテンシ問題が発生した場合や、プロセスの一部が複製されずにファイルが作成された場合、ファイルは銀行に電子デポジットとして送信されたときに失敗します。これは回避策ではありません。これは、すべてのデータが実際に存在することを確認するためのチェックです。 – Aaron

+0

+1ですが、REALの問題はヘッダー行の量データを複製しています –

+0

@Aaron、レプリケーションの一部として、一部のテーブル(場所ごとに1行)のLastReplicated列を更新できないため、いずれかの場所にエラーがあった場合は単一のクエリ。 –