我有一个表,其中包含一个用于分组的字段和另一个保存数据的字段。我想要一个很好的方法来找到任何 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 应该能够以更简单的方式完成的事情。
将表格中的所有内容分组,计算 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)使用 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 中做到这一点?
提前致谢。
忍者
您正在寻找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)
听起来您正在寻找在 中具有单个不同值的每个组DATACOLUMN
:
SELECT GROUPCOLUMN
FROM #TABLE
GROUP BY GROUPCOLUMN
HAVING COUNT(DISTINCT DATACOLUMN) = 1
Run Code Online (Sandbox Code Playgroud)
请注意,COUNT(DISTINCT ...)
这不算NULL
作不同的值。