2009-07-22 12 views
8

の差を検索する私は、各プロダクトID(PROC_ID)で行の合計数を見つけるために書いたSQLクエリされます。以下はSQLのCOUNT(*)とグループ化 - の下の行

SELECT proc_id, count(*) 
FROM proc 
WHERE grouping_primary = 'SLB' 
AND eff_date = '01-JUL-09' 
GROUP BY proc_id 
ORDER BY proc_id; 

はの結果であります上記のSQLクエリ:

 
proc_id count(*) 
01 626 
02 624 
03 626 
04 624 
05 622 
06 624 
07 624 
09 624

注意総数PROC_ID =による '01'、PROC_ID = '03'、及びPROC_ID = '05' は異なる(他のPROC_IDとして624行に等しくない)です。

他のproc_idと比較してproc_id = '01'、proc_id = '03'、およびproc_id = '05'で異なるproc_id行を見つけるSQLクエリを作成するにはどうすればよいですか?

+0

私があなたの質問を正しく理解していれば、わかりやすいものを作るために残りのテーブルの構造に関する詳細情報が必要です。 – Thorarin

答えて

2

あなたは624がマジックナンバーであることがわかっている場合:

SELECT proc_id, count(*) 
FROM proc 
WHERE grouping_primary = 'SLB' 
AND eff_date = '01-JUL-09' 
GROUP BY proc_id 
HAVING count(*) <> 624 
ORDER BY proc_id; 
14

まずあなたが「624」が正しい作る基準を定義する必要があります。平均はcount(*)ですか?最も頻繁に発生するのはcount(*)ですか?あなたのお気に入りはcount(*)ですか?

次に、あなたの条件に一致しないものを分離するためにHAVING句を使用することができます。

SELECT proc_id, count(*) 
FROM proc 
WHERE grouping_primary = 'SLB' 
AND eff_date = '01-JUL-09' 
GROUP BY proc_id 
HAVING count(*) <> 624 
ORDER BY proc_id; 

か:

SELECT proc_id, count(*) 
FROM proc 
WHERE grouping_primary = 'SLB' 
AND eff_date = '01-JUL-09' 
GROUP BY proc_id 
HAVING count(*) <> (
    <insert here a subquery that produces the magic '624'> 
) 
ORDER BY proc_id; 
+3

+1サブクエリ –

0

これを試してみてください。

SELECT proc_id, count(*) 
FROM proc 
WHERE grouping_primary = 'SLB' 
AND eff_date = '01-JUL-09' 
GROUP BY proc_id 
HAVING count(*) <> (select count(*) from proc z where proc_id in (1) group by proc_id) 
ORDER BY proc_id; 
0

あなたはこれを行うことはできません。一部のプロシージャでは、そのProcIdの行数が少なくなります。言い換えれば、procIdがcount = 624を持たない行は、存在しない行です。どのようなクエリでこれらの行を表示できますか?

あまりにも多くの行を持つProcIdsの場合、IF(これは大きい場合)、他のprocIdsの624のすべての行には、あまりにも多いセットの624カウントのサブセットと共通の属性があります。大きな行がある場合は、「余分な」行を識別できる可能性があります。見つからない行を特定する方法はありません。行の数が多すぎるか少なすぎるかを特定するだけです。

0

あなたの質問が正しく(他の投稿された回答とは異なります) proc_id 01を異なるようにしたいですか?その場合、同じでなければならないすべての列に参加し、その相違点を調べる必要があります。だから、02と01を比較する:

SELECT [01].* 
FROM (
    SELECT * FROM proc 
    WHERE grouping_primary = 'SLB' 
    AND eff_date = '01-JUL-09' 
    AND proc_id = '01' 
) as [01] 
FULL JOIN (
    SELECT * FROM proc 
    WHERE grouping_primary = 'SLB' 
    AND eff_date = '01-JUL-09' 
    AND proc_id = '02' 
) as [02] ON 
    [01].col1 = [02].col1 
    AND [01].col2 = [02].col2 
    AND [01].col3 = [02].col3 
    /* etc...just don't include proc_id */ 
WHERE 
    [01].proc_id IS NULL --no match in [02] 
    OR [02].proc_id IS NULL --no match in [01] 

を私は、MS SQL Serverは、列の束を持っている場合、それは簡単にすることが行ハッシュ関数を持っているかなり確信している...しかし、私は考えることができませんそれの名前。

+0

のため、私は質問を理解しているように、それを異なる値にするのではなく、単純にそのprocIdを持つ行の数...列の値に関係なく - –

+0

CHECKSUMはマジック行ハッシュ関数 –

0

これを見つけるには、NOT INというフレーズを使用します。不足している行を見つけるには、ロジックを逆にする必要があります。これは、自然に、すべての624行がproc_idからproc_idまで同じであることを前提としています。

SELECT proc_id, varying_column 
FROM proc 
WHERE grouping_primary = 'SLB' 
AND eff_date = '01-JUL-09' 
AND varying_column NOT IN (SELECT b.varying_column 
          FROM proc b 
          WHERE b.grouping_primary = 'SLB' 
          AND b.eff_date = '01-JUL-09' 
          AND b.proc_id = (SELECT FIRST a.proc_id 
               FROM proc a 
               WHERE a.grouping_primary = 'SLB' 
               AND a.eff_date = '01-JUL-09' 
               AND COUNT(a.*) = 624 
               GROUP BY a.proc_id 
               ORDER BY a.proc_id;)) 
ORDER BY proc_id, varying_column; 
関連する問題