使用连接时,多个列包含来自一个表的计数

时间:2018-03-12 01:32:06

标签: sql postgresql

我是使用psql的新手,并且有兴趣在同一个表上使用count函数根据条件输出具有不同计数的多个不同列。

我的表格包含自动租借行程,列数为short tripstripsavis_trips

在我的查询中

select TO_CHAR(date_trunc('day', start_time::timestamp),'YYYY-MM-DD')  AS date,
count(*) filter (where distance > 0 and distance < 100) AS short_trips,
count(*) as trips,
    (SELECT COUNT(*) FROM routes INNER JOIN rentals on rentals.id = routes.rental_id 
     WHERE rentals.name = 'Avis 'AND
    routes.start_time::timestamp <= CURRENT_TIMESTAMP
    ) AS avis_trips FROM
routes WHERE
start_time::timestamp <= CURRENT_TIMESTAMP 
GROUP BY date ORDER BY date DESC

此查询可以为short_tripstrips生成并生成正确的结果,但不会按date对Avis行程进行分组 - 而是生成每行所有avis行程的计数。

所需的输出看起来像这样

output
        date short_trips trips avis_trips
1 2018-03-10          10    12          1
2 2018-03-09           6    11          2
3 2018-03-08           8    10          1 ...

如何将INNER JOIN与单独的计数列集成?

1 个答案:

答案 0 :(得分:0)

将您的子选择移至主查询,以便您拥有筛选计数所需的所有列。如果不是所有LEFT JOIN都有相关的routes

,请使用rental
SELECT
  start_time :: DATE AS date,
  count(*) FILTER (WHERE distance > 0 AND distance < 100) AS short_trips,
  count(*) AS trips,
  count(*) FILTER (WHERE r.name = 'Avis') AS avis_trips
FROM routes
  LEFT JOIN rentals r ON r.id = routes.rental_id
WHERE
  routes.start_time <= now()
GROUP BY date
ORDER BY date DESC;

为了清晰起见,我删除了日期。