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:如何在具有主键的快照复制中查找所有表