【问题标题】:TSQL Find If All Records In A Group Have The Same ValueTSQL查找组中的所有记录是否具有相同的值
【发布时间】:2016-10-07 16:33:43
【问题描述】:

我有一个表,其中包含一个用于分组的字段和另一个保存数据的字段。我想要一种找到每个 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组

在上面的示例中,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
    
  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
    

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

提前致谢。

忍者

【问题讨论】:

    标签: sql-server tsql


    【解决方案1】:

    您正在寻找HAVING 子句

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

    【讨论】:

    • 如此简单却又如此有效!非常感谢@Prdp。
    【解决方案2】:

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

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

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

    【讨论】:

    • 啊哈!正是我想要的。我忘记了COUNT(DISTINCT ...)
    【解决方案3】:

    您应该能够比较 COUNT(*)COUNT(DISTINCT DATACOLUMN) 来做到这一点。像这样:

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

    【讨论】:

    • 但他只检查'DATA1'
    • 示例 sql 使用该值,但问题文本仅显示“特定值”。不确定要求,我当然更喜欢更灵活和通用的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-26
    • 1970-01-01
    • 1970-01-01
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多