sql - 如何右连接这些系列,以便此查询将返回 Postgresql SQL 中 count = 0 的结果?

标签 sql postgresql

我有以下在 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

这是存储桶查询的变体,但包含所有数据,因此 fromdate 为 NULL。 我正在尝试从表 event 中获取计数并按 event_level 进行计数。但我还希望当该特定 event_level 没有任何事件时返回数字 0。但当前的右连接并没有完成这项工作。我究竟做错了什么? 我还尝试添加 OR e.project_id IS null 认为它可能会过滤掉 0 计数。或者这是否可以与 CROSS JOIN 一起使用,如果可以的话如何?

当前结果:

+----------+------------+-------+
| fromdate | eventlevel | count |
+----------+------------+-------+
| null     |          3 |     1 |
+----------+------------+-------+

期望的结果:

+----------+------------+-------+
| fromdate | eventlevel | count |
+----------+------------+-------+
| null     |          3 |     1 |
| null     |          2 |     0 |
| null     |          1 |     0 |
| null     |          0 |     0 |
+----------+------------+-------+

最佳答案

您必须将 e.project_id 条件从 WHERE 子句移至 ON 子句才能获得真正的 RIGHT JOIN结果:

           ...
           END) AS COUNT
FROM event e
RIGHT JOIN
  (SELECT generate_series(0, 3) AS eventlevel) l ON e.event_level = l.eventlevel
AND e.project_id = :projectId
...

关于sql - 如何右连接这些系列,以便此查询将返回 Postgresql SQL 中 count = 0 的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62000509/

相关文章:

sql - select_list : Only take some columns 中的条件

ruby-on-rails - Rails 5 迁移数据类型问题

mysql - 如何获取组的 mysql 总行数百分比?

sql - 如何合并不相关的表,但对公共(public)列类型进行排序?

mysql - 从 Ruby 中的表中获取所有值

php - 在单个 PHP 文件中连接两个数据库

PostgreSQL 拒绝连接

laravel - 如何定义模式迁移 Laravel Postgres?

postgresql - 迁移发生后,Sequelize 模型定义文件会发生什么变化?

mysql - 阿雷尔 gem : "SELECT *" missing from where clause in rails