如何检查是否存在某个值?

时间:2017-11-10 08:43:18

标签: sql sql-server

我有一个名为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 

4 个答案:

答案 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

DBFiddle

答案 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;