我是使用psql的新手,并且有兴趣在同一个表上使用count
函数根据条件输出具有不同计数的多个不同列。
我的表格包含自动租借行程,列数为short trips
,trips
和avis_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_trips
和trips
生成并生成正确的结果,但不会按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
与单独的计数列集成?
答案 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;
为了清晰起见,我删除了日期。