我有一个名为CUR_VALID的历史表。这个表看起来像这样:
ID CUR_VALID
1 N
1 N
1 Y
2 N
2 Y
3 Y
对于每个ID,需要有一个Y.如果没有Y或多个Y,则表示存在错误。检查我是否已经有多个Y的判断。现在我只需要检查每个ID,如果存在一个Y.我只是不知道该怎么做。这就是我到目前为止所拥有的。那么如何检查值'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
答案 0 :(得分: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
账单。
答案 1 :(得分:1)
此查询返回两者中没有至少一个&#39; Y&#39;价值和多于一个&#39; Y&#39;价值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
答案 2 :(得分:1)
以下查询将为您提供未满足完整性条件的ID列表:对于每个ID,需要有一个Y.如果没有Y或多个Y,则表示存在错误。
select T1.id from table T1 where (select count(*) from table T2 where T2.id=T1.id and T2.CUR_VALID='Y')!=1
答案 3 :(得分:1)
据我了解,您希望获得完整性检查通过的所有id
。对您进行完整性检查意味着,CUR_VALID
表中只有一行Y
值等于CUR_VALID
。
这可以通过group by
子句来实现:
select id from CUR_VALID
where CUR_VALID.CUR_VALID = 'Y'
group by id
having count(CUR_VALID.CUR_VALID) = 1;