【发布时间】: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 中有没有更好的方法来做到这一点?
提前致谢。
忍者
【问题讨论】:
标签: sql-server tsql