说我有一个表格,格式为:
| id | category|
|----|---------|
| 10 | A |
| 10 | B |
| 10 | C |
| 2 | C |
我想计算类别变量中具有三个值A,B和C的不同ID的数量。在这种情况下,查询将返回1
,因为仅对于id = 10才为true。
我的直觉是编写以下查询以获取该值:
SELECT
COUNT(DISTINCT id),
SUM(CASE WHEN category = 'A' THEN 1 else 0 END) AS A,
SUM(CASE WHEN category = 'B' THEN 1 else 0 END) AS B,
SUM(CASE WHEN category = 'C' THEN 1 else 0 END) AS C
FROM
table
GROUP BY
id
HAVING
A >= 1
AND
B >= 1
AND
C >= 1
但是,这感觉有些过头了-是否有更简单的方法来达到预期的结果?
答案 0 :(得分:1)
我假设这是一个更大的表的一部分,您的ID和类别可以出现多次,并且由于其他字段而仍然是不同的,并且您知道要查找多少个类别。
SELECT ID, COUNT(ID)
FROM(
SELECT DISTINCT ID, CATEGORY
FROM TABLE)
GROUP BY ID
HAVING COUNT(ID) = 3 --or however many categories you want
此处的子查询会删除无关的信息,并强制您的ID对每个类别显示一次。然后,您可以算出它出现的次数,并查找显示3次或想要多次的次数。
答案 1 :(得分:1)
您很亲密,但是您需要两个聚合级别。假设没有重复的行:
SELECT COUNT(*)
FROM (SELECT id
FROM t
WHERE Category IN ('A', 'B', 'C')
GROUP BY id
HAVING COUNT(*) = 3
) t;