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

TSQL -- find records in table with multiples in one column, and at least one specific occurrence of a value in another column

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

如果我有: ourDB.dbo.ourTable col1 和 col2 以及 col 3

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

TSQL -- 在 table

中查找特定事件

所以开始的人会是:

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?

您必须仅 GROUP BY 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' 的行:

SELECT * FROM ourDB.dbo.ourTable
WHERE
  col2 = 'Val1'
  AND 
  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, col3

下面的替代方法,最初来自同事,我修改了一些。 注意:不一定比其他(已接受的)答案更好,只是方法不同。

 -- 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'
          )
         )
    )