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

Sql 如何检查某个值是否存在?,sql,sql-server,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') ,[BI

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

此查询返回的值既没有至少一个“Y”值,也有多个“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

此查询返回的值既没有至少一个“Y”值,也有多个“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

以下查询将为您提供不满足完整性条件的id列表:对于每个id,需要有一个Y。如果没有Y或多个Y,则存在错误


以下查询将为您提供不满足完整性条件的id列表:对于每个id,需要有一个Y。如果没有Y或多个Y,则存在错误


当你对“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

比尔。

当你对“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

账单。

据我所知,您希望获得完整性检查通过的所有id。完整性检查意味着,CUR_VALID表中只有一行CUR_VALID值等于Y

这可以通过GROUPBY子句实现:


据我所知,您希望获得完整性检查通过的所有id。完整性检查意味着,CUR_VALID表中只有一行CUR_VALID值等于Y

这可以通过GROUPBY子句实现:


Yor语法看起来像SQL Server,不像mysql。也许您应该更改标记或语法,使其看起来像SQL Server,而不是mysql。也许你应该改变标记,当你想计算行数时,我会把它计算在内。countexpression只统计非null的出现次数,但是CUR_VALID.CUR_VALID不能为null,因为您的WHERE子句。因此,使用countCUR\u VALID.CUR\u VALID会使查询看起来比实际情况更复杂,并降低可读性。没错!最好在有子句时写count*,当你想计算行数时,我会计算它。countexpression只统计非null的出现次数,但是CUR_VALID.CUR_VALID不能为null,因为您的WHERE子句。因此,使用countCUR\u VALID.CUR\u VALID会使查询看起来比实际情况更复杂,并降低可读性。没错!最好在有克劳塞戈德答案时写上count*。工作完美。“N”背后的想法是只数1条记录。如果这个记录是N,我就知道这是一个错误,因为需要有一个Y。不管怎样,你的答案是完美的:好答案。工作完美。“N”背后的想法是只数1条记录。如果这个记录是N,我就知道这是一个错误,因为需要有一个Y。无论如何,你的答案是完美的: