我在postgresql数据库上运行以下查询:
SELECT NULL AS fromdate,
l.eventlevel,
SUM(CASE
WHEN e.id IS NULL THEN 0
ELSE 1
END) AS COUNT
FROM event e
RIGHT JOIN
(SELECT generate_series(0, 3) AS eventlevel) l ON e.event_level = l.eventlevel
WHERE e.project_id = :projectId
GROUP BY l.eventlevel
ORDER BY l.eventlevel DESC
使用(修剪过的)事件表:
TABLE public.event
id uuid NOT NULL,
event_level integer NOT NULL
这是Bucked查询的一个变体,但包含所有数据,因此为空fromdate。我想从table上数数 event
并按事件级别计算。但我也想知道号码 0
在该特定事件级别没有任何事件时返回。但目前的右翼联盟并没有做到这一点。我做错什么了?我还尝试添加 OR e.project_id IS null
认为它可能过滤掉了0个计数。或者交叉连接会起作用吗?如果是,怎么做?
当前结果:
+----------+------------+-------+
| fromdate | eventlevel | count |
+----------+------------+-------+
| null | 3 | 1 |
+----------+------------+-------+
期望结果:
+----------+------------+-------+
| fromdate | eventlevel | count |
+----------+------------+-------+
| null | 3 | 1 |
| null | 2 | 0 |
| null | 1 | 0 |
| null | 0 | 0 |
+----------+------------+-------+
2条答案
按热度按时间omjgkv6w1#
我建议避免
RIGHT JOIN
s和使用LEFT JOIN
s。对于遵循逻辑来说,它们更简单——将所有内容都保留在第一个表中,并在随后的表中匹配行。您的问题是过滤器的位置——它过滤掉外部连接的行。所以这需要深入研究
ON
条款。我建议:请注意其他简化:
不需要子查询
generate_series
.你可以用
COUNT()
而不是你的案例逻辑。daupos2t2#
你得把车开走
e.project_id
来自WHERE
条款ON
要实现的子句RIGHT JOIN
结果: