检查每个组的所有行的两列是否相等

时间:2015-12-14 14:54:26

标签: sql sql-server group-by equality having

假设这样的数据库:

Date | Attribute1 | Attribute2 | ... | AttributeN
-------------------------------------------------
1    | A          | C          | ... | ...
1    | B          | C          | ... | ...
2    | A          | A          | ... | ...
2    | B          | B          | ... | ...
2    | A          | A          | ... | ...
3    | B          | B          | ... | ...
3    | A          | A          | ... | ...
4    | B          | C          | ... | ...
4    | A          | A          | ... | ...

我正在尝试找出哪些唯一日期(它们在实际案例中是实际的date但我认为不重要),{{1>所有元素{{1} }等于Attribute1中的对应元素。上面的示例数据的结果将是

Attribute2

因为对于Date ---- 2 3 等于date的每条记录(2都相同),3等于Attribute1。不会返回Attribute2,因为虽然示例中的最后一条记录符合标准(因为4等于A),但第二条最后一条记录却没有(因为A没有等于B)。

我无法弄清楚如何编写此查询,我希望有一些聚合函数(在下面的代码中显示为C),这将允许我编写类似的内容:

ALL(...)

有这样的功能吗?否则,使用SELECT Date FROM myTable GROUP BY Date HAVING ALL(Attribute1 = Attribute2) 可能有一种聪明的方法吗?

3 个答案:

答案 0 :(得分:4)

您可以使用HAVINGCASE

SELECT [Date]
FROM #tab
GROUP BY [Date]
HAVING SUM(CASE WHEN Attribute1 = Attribute2 THEN 0 ELSE 1 END) = 0

LiveDemo

  

否则有一种聪明的方法可以使用COUNT吗?

为什么不:)带COUNT的版本:

SELECT [Date]
FROM #tab
GROUP BY [Date]
HAVING COUNT(CASE WHEN Attribute1 <> Attribute2 THEN 1 END) = 0

LiveDemo2

答案 1 :(得分:3)

也许这就是:

select Date from Test
Except
Select Date from Test where Attribute1 <> Attribute2

答案 2 :(得分:1)

如果你扭转它,逻辑会更容易。您需要所有唯一的DATE值,其中不是 Attribute1Attribute2不同的行:

SELECT DISTINCT [Date] FROM myTable
WHERE [Date] NOT IN (
   SELECT [Date] FROM myTable
   WHERE Attribute1 != Attribute2)