如何使用Sqlstatement查询Expect Count的结果
ID StuId IsDone ExpectCount
11111 q-01 false 1
11111 q-02 false 2
11111 q-03 false 3
11111 q-02 true 2
11111 q-04 false 3
22222 q-04 false 2
11111 q-01 true 1
11111 q-01 true 1
期望如果相同的ID StuId IsDone = true将忽略它。
11111 = 3
22222 = 1
但
11111 = 1
22222 = 1
我查询SELECT ID, count(*)
FROM
(SELECT DISTINCT StuId, ID, IsDone FROM Student s where IsDone = false) stu
group by ID;
您可以通过更改查询获得预期的输出,如本演示所示。
SELECT ID, COUNT(DISTINCT StuId) - SUM(CASE WHEN IsDone = true THEN 1 ELSE 0 END) as ExpectedCount
FROM Student
GROUP BY ID;
输出:
id | ExpectedCount | 11111 | 3 |
---|---|
22222 | 1 |
正确的解决方案是进行2级聚合。首先,我们可以通过ID
和StuId
进行聚合,以确定哪些StuId
只有假的IsDone
值。然后,我们单独按ID
进行聚合,以获得纯错误计数。
WITH cte AS (
SELECT ID, StuId, COUNT(*) FILTER (WHERE IsDone = true) cnt
FROM Student
GROUP BY ID, StuId
)
SELECT ID, COUNT(*) FILTER (WHERE cnt = 0) AS cnt
FROM cte
GROUP BY ID
ORDER BY ID;