TSQL 查找组中的所有记录是否具有相同的值

Nin*_*nja 8 t-sql sql-server

我有一个表,其中包含一个用于分组的字段和另一个保存数据的字段。我想要一个很好的方法来找到任何 GroupColumn 值,其中每个 DataColumn 值都包含一个特定的值。

例子

+-------------+------------+
| GroupColumn | DataColumn |
+-------------+------------+
| GroupA      | Data1      |
| GroupA      | Data2      |
| GroupA      | Data3      |
| GroupB      | Data1      |<---These two values are the same
| GroupB      | Data1      |<---for the same group
| GroupC      | Data1      |
| GroupC      | Data2      |
| GroupC      | Data2      |
| GroupC      | Data3      |
+-------------+------------+
Run Code Online (Sandbox Code Playgroud)

期望输出

B组

在上面的示例中,GroupA 和 GroupC 的 DataColumn 发生了变化,但对于 GroupB,DataColumn 中的两个值都相同,因此我希望返回此结果。

当前解决方案

我有 2 个基于相同主题的当前解决方案,但我觉得这是 SQL 应该能够以更简单的方式完成的事情。

  1. 将表格中的所有内容分组,计算 GroupColumn 出现的次数并将其放入表格中。做同样的事情,但应用一个条件。加入 2 个表并查看 2 个计数不匹配的地方。

    SELECT GROUPCOLUMN, COUNT(*) [TOTAL] INTO #ALL
    FROM #TABLE
    GROUP BY GROUPCOLUMN
    
    SELECT GROUPCOLUMN, COUNT(*) [TOTAL] INTO #SOME
    FROM #TABLE
    WHERE DATACOLUMN = 'DATA1'
    GROUP BY GROUPCOLUMN
    
    SELECT * FROM #ALL A
    INNER JOIN #SOME S ON A.GROUPCOLUMN = S.GROUPCOLUMN
    WHERE S.TOTAL = A.TOTAL
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用 SUM 和 CASE 检查特定值并计算所有内容并检查子查询。

    SELECT * FROM 
    (SELECT GROUPCOLUMN, SUM(CASE WHEN DATACOLUMN = 'DATA1' THEN 1 ELSE 0 END) [VALUE], COUNT(*) [TOTAL] FROM #TABLE (NOLOCK)
    GROUP BY GROUPCOLUMN) A
    WHERE A.VALUE = A.TOTAL
    
    Run Code Online (Sandbox Code Playgroud)

有没有更好的方法在 SQL 中做到这一点?

提前致谢。

忍者

Pரத*_*ீப் 9

您正在寻找HAVING条款

SELECT GROUPCOLUMN
FROM   #TABLE (NOLOCK)
GROUP  BY GROUPCOLUMN
HAVING Count(*) = Count(case when DATACOLUMN = 'DATA1' then 1 end) 
Run Code Online (Sandbox Code Playgroud)


Mar*_*ese 5

听起来您正在寻找在 中具有单个不同值的每个组DATACOLUMN

SELECT GROUPCOLUMN
FROM #TABLE
GROUP BY GROUPCOLUMN
HAVING COUNT(DISTINCT DATACOLUMN) = 1
Run Code Online (Sandbox Code Playgroud)

请注意,COUNT(DISTINCT ...)这不算NULL作不同的值。