Sql server TSQL——在表中查找一列中有多个值的记录,并且在另一列中至少有一个特定值出现

Sql server TSQL——在表中查找一列中有多个值的记录,并且在另一列中至少有一个特定值出现,sql-server,tsql,group-by,having-clause,Sql Server,Tsql,Group By,Having Clause,TSQL-在表中查找一列中有多个值的记录,并且在另一列中至少有一个特定值出现 如果我有: ourDB.dbo.ourTable与col1、col2和col3 我想找到这样的事件 *col1的值出现多次 *至少有一个col2='Val1'的实例至少出现一次 TSQL-在表中查找特定的引用 因此,我们可以从以下几点开始: Select col1, col2, col3 FROM ourDB.dbo.ourTable having count(col1) > 1 WHERE (col2 = 'V

TSQL-在表中查找一列中有多个值的记录,并且在另一列中至少有一个特定值出现

如果我有: ourDB.dbo.ourTable与col1、col2和col3

我想找到这样的事件 *col1的值出现多次 *至少有一个col2='Val1'的实例至少出现一次

TSQL-在表中查找特定的引用

因此,我们可以从以下几点开始:

Select col1, col2, col3
FROM ourDB.dbo.ourTable
having count(col1) > 1
WHERE
(col2 = 'Val1')
Group by col1, col2, col3
Order by col1, col2, col3
这将发现col2总是与“Val1”一起出现,但如何将其推广到至少有一次具有“Val1”的col2?

您必须仅按col1分组,并通过条件聚合获得所需的所有col1值:

SELECT * FROM ourDB.dbo.ourTable
WHERE col1 IN (
  SELECT col1
  FROM ourDB.dbo.ourTable
  GROUP BY col1
  HAVING COUNT(*) > 1 AND SUM(CASE WHEN col2 = 'Val1' THEN 1 END) > 0
)
ORDER BY col1, col2, col3
如果只需要col2='Val1'的行:


下面的替代方法,最初来自同事,我对其进行了一些修改。 注:不一定比其他公认的答案更好,只是方法不同而已

 -- GENERIC_JOIN_WITH_SPECIFIC_COUNTS_Q_v_0.sql
    USE [ourDB]
    SELECT COUNT( distinct titleid)  -- also could use COUNT(*)  
    from ourTable
    
    WHERE 
    (
        (1 < 
          (
            select count( col1) 
            from ourTable
            GROUP BY col1
            HAVING (count(col1 > 1) 
            -- more than one col1 occurence
            )
         )
    
        AND 
        (0 < 
          (
            select count(*) from ourTable
            WHERE( col2 = 'Val1' ) 
            -- at least one occurence of col2 having 'Val1'
          )
         )
    )

还是不知道为什么这里会有反对票?
 -- GENERIC_JOIN_WITH_SPECIFIC_COUNTS_Q_v_0.sql
    USE [ourDB]
    SELECT COUNT( distinct titleid)  -- also could use COUNT(*)  
    from ourTable
    
    WHERE 
    (
        (1 < 
          (
            select count( col1) 
            from ourTable
            GROUP BY col1
            HAVING (count(col1 > 1) 
            -- more than one col1 occurence
            )
         )
    
        AND 
        (0 < 
          (
            select count(*) from ourTable
            WHERE( col2 = 'Val1' ) 
            -- at least one occurence of col2 having 'Val1'
          )
         )
    )