Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PostgreSQL中将两个或多个不同的SELECT查询组合到具有不同条件的同一个表中_Sql_Node.js_Postgresql_Express - Fatal编程技术网

在PostgreSQL中将两个或多个不同的SELECT查询组合到具有不同条件的同一个表中

在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语句会抱

我需要从同一个表中检索两个不同的结果,并将它们组合成一个结果集。我使用聚合函数生成一些数据的报告,每列都有不同的“where”条件

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
的实际数据类型,您可能需要调整输入以消除对会话当前时区设置的依赖性。见:


我不能,因为我需要sum(price)来使用enddate参数(对于本月到期的付款)和count(*)来使用date_added参数(对于本月添加的任务),因为这两个合谋不一定总是在同一个月内(例如11月28日添加的任务,即12月15日到期)@RafaelOliveira。我懂了。那是不同的日期。只需使用条件聚合。我完全不知道您在那里做了什么,先生,但它非常有效!谢谢!
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';