同僚がデータをマッピングするために必要なテーブルをまとめ、テーブルはOP_IDとBillTypeの2つのフィールドで構成されています。理論的には、2つの間に1対1の対応が必要です。すべてのOp_IDには1つの請求タイプしかない必要があります。Count()はSQLで期待通りに機能しません
しかし、私がそれを使い始めたとき、異なるBillTypeを持つOP_IDが重複していることがわかりました。例えば:十分
SELECT OP_ID, BillType
FROM MappingTable
GROUP BY OP_ID, BillType
シンプル:
OP_Id BillType
007a000v9GWkAAM BillReady
007a000v9GWkAAM RateReady
だから最初に私はIDとBillTypesのユニークな組み合わせにグループにデータをクエリを構築しました。このセットには、上記の2つのレコードが含まれていなければなりません。次に、集約されたデータセット内のOP_Idsをカウントするために、これを中心に別のクエリをラップしました。理論的には、複数のBillTypeを持つOP_IDは2回発生するので、1を超える数を返す必要があります。
SELECT OP_ID, BillType, Count(OP_ID)
FROM
(
SELECT OP_ID, BillType
FROM MappingTable
GROUP BY OP_ID, BillType
) Base
GROUP BY OP_ID, BillType
HAVING Count(OP_ID) > 1
しかし、このクエリは何も返しません。ここでは何でももっと不可解:
OP_ID BillType CountOfOP_IDs
007a000v9GWkAAM BillReady 1
007a000v9GWkAAM RateReady 1
だから明確にするための2つのレコードがあります。私はすでにそれは私が得るものだだまされやすい人、知っているので、私は、HAVING句を削除し、上記のみOP_IDを引っ張ってクエリを制限する場合OP_ID 007a000v9GWkAAMですが、SQLは1つしかカウントされません!
これはとても簡単なので、私はCOUNT()がどのように機能するかに関する基本的なものが不足していると確信しています。参考までに、私はSQL Server 2014で作業しており、両方の列はnvarcharです。私は、SQLが両方のレコードのOP_IDを同一であると評価することも確認しました。誰がなぜこれが起こっているのか知っていますか?
正解と思われるものに匿名ダウンワードがある理由はありますか? –
ダウン投票者ではありませんが、私の推測では、「このクエリは何を返すのですか?答えで。 --- 'HAVING MIN(BillType)<> MAX(BillType) 'は、2つの行が存在する場合には' OP_ID'値を見つけられません.1つはヌル 'BillType'を持ち、もう1つは値を持ちます。 'BillType'が' NOT NULL'であれば問題ではないかもしれませんが、それは明記されていないので、あなたは現在何か証拠にないと仮定しています。 – Andreas
@アンドレアス。 。 。非常にありそうもない。私の答えの質問は、OPの結果につながる可能性のあるデータ品質に関するものです。 'having'節に' min() 'と' max() 'を使うのは、' NULL'値がないと仮定して、お勧めのアプローチです。質問にはその列に 'NULL'値の提案はありません。誰かがこれらの理由でdownvoteを行っている場合は、本当に理由を説明する必要があります。 –