在PostgreSQL中将两个或多个不同的SELECT查询组合到具有不同条件的同一个表中
我需要从同一个表中检索两个不同的结果,并将它们组合成一个结果集。我使用聚合函数生成一些数据的报告,每列都有不同的“where”条件在PostgreSQL中将两个或多个不同的SELECT查询组合到具有不同条件的同一个表中,sql,node.js,postgresql,express,Sql,Node.js,Postgresql,Express,我需要从同一个表中检索两个不同的结果,并将它们组合成一个结果集。我使用聚合函数生成一些数据的报告,每列都有不同的“where”条件 select sum(price) as lucro_esperado from tasks where extract(month from enddate) = 12 AND extract(year from enddate) = 2019 及 因为我对这个例子感兴趣的是聚合函数结果,所以我不能使用Join语句(因为在条件下没有),Union语句会抱
select sum(price)
as lucro_esperado
from tasks
where extract(month from enddate) = 12
AND extract(year from enddate) = 2019
及
因为我对这个例子感兴趣的是聚合函数结果,所以我不能使用Join语句(因为在条件下没有),Union语句会抱怨不同的数据类型,因为它试图错误地将两个聚合结果合并到一个列中。有没有其他方法可以实现这一点,而不必从Node.js端点查询数据库两次,并手动组合它们?只需将此作为一个查询编写:
select sum(price) as lucro_esperado, count(*) as tarefas_abertas
from tasks
where extract(month from enddate) = 12 and
extract(year from enddate) = 2019
我建议您将where
条款更改为:
where enddate >= '2019-12-01' and
enddate < '2020-01-01'
使用aggregate
过滤器
子句进行条件聚合。并保持count(*)
就像你拥有它一样。这更短更快:
SELECT sum(price) FILTER (WHERE enddate >= '2019-12-01' AND enddate < '2020-01-01') AS lucro_esperado
, count(*) FILTER (WHERE date_added >= '2019-12-01' AND date_added < '2020-01-01') AS tarefas_abertas
FROM tasks;
根据enddate
和date\u added
的实际数据类型,您可能需要调整输入以消除对会话当前时区设置的依赖性。见:
select sum(case when enddate >= '2019-12-01' and enddate < '2020-01-01' then price end) as lucro_esperado,
sum(case when date_added >= '2019-12-01' and date_added < '2020-01-01' then 1 else 0 end) as tarefas_abertas
from tasks;
SELECT sum(price) FILTER (WHERE enddate >= '2019-12-01' AND enddate < '2020-01-01') AS lucro_esperado
, count(*) FILTER (WHERE date_added >= '2019-12-01' AND date_added < '2020-01-01') AS tarefas_abertas
FROM tasks;
SELECT sum(price) FILTER (WHERE enddate >= '2019-12-01' AND enddate < '2020-01-01') AS lucro_esperado
, count(*) FILTER (WHERE date_added >= '2019-12-01' AND date_added < '2020-01-01') AS tarefas_abertas
FROM tasks
WHERE enddate >= '2019-12-01' AND enddate < '2020-01-01'
OR date_added >= '2019-12-01' AND date_added < '2020-01-01';