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

时间:2016-10-07 16:33:44

标签: sql-server tsql

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

示例

+-------------+------------+
| 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      |
+-------------+------------+

所需输出

B组

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

当前解决方案

我有两个基于相同主题的当前解决方案,但我觉得这是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
    
  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
    
  3. 在SQL中有更好的方法吗?

    提前致谢。

3 个答案:

答案 0 :(得分:2)

您正在寻找HAVING子句

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

答案 1 :(得分:1)

听起来您正在寻找在DATACOLUMN中具有唯一值的每个组:

SELECT GROUPCOLUMN
FROM #TABLE
GROUP BY GROUPCOLUMN
HAVING COUNT(DISTINCT DATACOLUMN) = 1

请注意,COUNT(DISTINCT ...)不会将NULL视为一个不同的值。

答案 2 :(得分:0)

您应该可以将COUNT(*)COUNT(DISTINCT DATACOLUMN)进行比较来执行此操作。像这样:

SELECT GROUPCOLUMN
FROM #TABLE
GROUP BY GROUPCOLUMN
HAVING Count(*) = Count(DISTINCT DATACOLUMN)