我有一个表,其中包含用于分组的字段和另一个保存数据的字段。我想要一个很好的方法来查找每个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应该能够以更简单的方式做的事情。
对表格中的所有内容进行分组,计算出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中有更好的方法吗?
提前致谢。
忍
答案 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)