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

Posted

技术标签:

【中文标题】TSQL查找组中的所有记录是不是具有相同的值【英文标题】: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 应该能够以更简单的方式完成的事情。

    对表格中的所有内容进行分组,计算 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
    

    使用 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 中有没有更好的方法来做到这一点?

提前致谢。

忍者

【问题讨论】:

【参考方案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 使用该值,但问题文本仅显示“特定值”。不确定要求,我当然更喜欢更灵活和通用的解决方案。

以上是关于TSQL查找组中的所有记录是不是具有相同的值的主要内容,如果未能解决你的问题,请参考以下文章

TSQL / SQL-SERVER:如何在具有主键的快照复制中查找所有表

查找所有具有相同姓氏和相同邮政编码的记录

如何编写 R 脚本来检查直线;即,对于任何给定的行,一组列中的所有值是不是具有相同的值

TSQL 透视或估计模型复制

从不同的相关记录组中选择两列之一中包含重复值的所有行

使用 vis.js 的时间轴组中所有项目的高度相同