2017-11-10 2 views
0

CUR_VALIDという履歴テーブルがあります。このテーブルは次のようになります。特定の値が存在するかどうかを確認するにはどうすればよいですか?

ID CUR_VALID 
1 N 
1 N 
1 Y 
2 N 
2 Y 
3 Y 

すべてのIDについて、1つのYが必要です.YまたはYが複数ある場合は、何か問題があります。複数のYがあるかどうかを確認するためのステートメントはすでに取得済みです。現在、1つのYが存在する場合は、すべてのIDを確認するだけです。私はそれをどうやって行うのか分かりません。これは私がこれまで持っていたものです。では、値 'Y'が存在するかどうかをどのようにチェックするのですか?

SELECT Count(1) [Number of N] 
     ,MAX(CUR_VALID = 'N') 
     ,[BILL_ID] 
     ,[BILL_MONTH] 
     ,[BILL_SRC_ID] 
FROM db.dbo.table 
    GROUP BY [BILL_ID] 
     ,[BILL_MONTH] 
     ,[BILL_SRC_ID] 
Having MAX(CUR_VALID = 'N') > 1 
+1

ヨールの構文は、MySQLを好きではないSQL-Serverのように見えます。たぶんあなたはタグを変更する必要があります – Jens

答えて

2

あなたは 'Y' に関心を持っているのに、なぜあなたは 'N' をいじっていますか?

使用条件付き集約は、あなたが興味を持っている値の数を取得します。

SELECT 
    COUNT(*) AS number_of_all, 
    COUNT(CASE WHEN cur_valid = 'Y' THEN 1 END) AS number_of_y, 
    COUNT(CASE WHEN cur_valid = 'N' THEN 1 END) AS number_of_n, 
    bill_id, 
    bill_month, 
    bill_src_id, 
FROM db.dbo.table 
GROUP BY bill_id, bill_month, bill_src_id; 

が唯一の有効な得るためにHAVING句を追加

HAVING COUNT(CASE WHEN cur_valid = 'Y' THEN 1 END) = 1 

または無効

HAVING COUNT(CASE WHEN cur_valid = 'Y' THEN 1 END) <> 1 

紙幣。

+0

良い答え。完璧に動作します。 「N」の背後にあるアイデアは、レコード1枚だけでした。このレコードがNなら、Yが必要な間違いがあることを知っています。とにかくあなたの答えはちょうど完璧です:) – Sandro21

1

このクエリは、少なくとも1つの 'Y'値と2つ以上の 'Y'値IDを持たないことを返します。

まず、Y値を合計して各IDに関連付け、そのテーブルから1を選択しないでください。

select * from (
    select ID, SUM(case when CUR_VALID = 'Y' then 1 else 0 end) as CNT 
    from table 
    group by ID 
) b where b.CNT <> 1 

DBFiddle

1

次のクエリは、あなたの整合性の条件が満たされていないされているIDのリストを与える:なしYまたは複数Yが存在しない場合、すべてのIDの場合は1つのY.が必要であるを何かがおかしい。

select T1.id from table T1 where (select count(*) from table T2 where T2.id=T1.id and T2.CUR_VALID='Y')!=1 
1

私が理解しているように、完全性検査に合格するidをすべて取得したいとします。そしてあなたの完全性チェックは、CUR_VALIDテーブルの値がYに等しい行が1つだけあることを意味します。

この

group by句によって達成することができます。

select id from CUR_VALID 
where CUR_VALID.CUR_VALID = 'Y' 
group by id 
having count(CUR_VALID.CUR_VALID) = 1; 
+0

行を数えたいので、この 'count(*)'を作成します。 'count(expression)'はヌル以外のオカレンスだけをカウントしますが、 'WHERE'節のために' CUR_VALID.CUR_VALID'は決してヌルになりません。したがって、 'count(CUR_VALID.CUR_VALID) 'を使用すると、このクエリは実際よりも複雑に見えるようになり、可読性が低下します。 –

+0

True! having節に 'count(*)'を書く方が良い –

関連する問題