sql - 如何使用一个 SQL 查询从多个日期范围中提取数据?

标签 sql postgresql

我有两个问题。每个查询都会拉取组织和客户之间的订单总数,以及订单的应收账款总额。除了日期范围外,查询是相同的。

SELECT org.organization_id, org.name, cust.name as customer,
count(*) as num_orders, round (sum(cast(o.total_charge as real))) as  receivables
FROM 
organization as org, orders as o, organization as cust, reconcile_order as ro
WHERE org.organization_id = o.shipper_org_id
and o.broker_org_id = cust.organization_id
and o.order_id = ro.order_id
and o.status = 'D'
and (ro.receive_payment_in_full = 0 or ro.receive_payment_in_full is NULL)
and (NOW()::DATE - o.delivery_confirmed_date::DATE) < 31
group by org.organization_id, org.name,
cust.name
order by org.name asc limit 20

SELECT org.organization_id, org.name, cust.name as customer,
count(*) as num_orders, round (sum(cast(o.total_charge as real))) as   receivables
FROM 
organization as org, orders as o, organization as cust, reconcile_order as ro
WHERE org.organization_id = o.shipper_org_id
and o.broker_org_id = cust.organization_id
and o.order_id = ro.order_id
and o.status = 'D'
and (ro.receive_payment_in_full = 0 or ro.receive_payment_in_full is NULL)
and (NOW()::DATE - o.delivery_confirmed_date::DATE) between 31 and 60
group by org.organization_id, org.name,
cust.name
order by org.name asc limit 20

但是我需要进行这个查询,以便输出是一个表,其中包含第一个日期范围内的订单和应收账款列,在这些列旁边还有第二个日期范围内的另一对列。 (即 num_orders < 31,receivables < 31,num_orders 31-60,receivables 31-60)

最佳答案

您可以将条件语句放在 count() 和 sum() 函数中。

因此,如果您调整 where 子句以返回所有订单(跨越两个日期范围),那么您可以在您的 select 子句中创建多个结果列,每个结果列仅从您想要的日期范围开始计算和求和。

SELECT ...
       count(CASE WHEN (NOW()::DATE - o.delivery_confirmed_date::DATE) < 31 THEN 1 ELSE NULL END) as num_orders_a,
       round(sum(CASE WHEN (NOW()::DATE - o.delivery_confirmed_date::DATE) < 31 THEN cast(o.total_charge as real) ELSE NULL END)) as receivables_a,
       count(CASE WHEN (NOW()::DATE - o.delivery_confirmed_date::DATE) BETWEEN 31 AND 60 THEN 1 ELSE NULL END) as num_orders_b,
       round(sum(CASE WHEN (NOW()::DATE - o.delivery_confirmed_date::DATE) BETWEEN 31 AND 60 THEN cast(o.total_charge as real) ELSE NULL END)) as receivables_b
(same FROM, WHERE, GROUP BY, and ORDER BY sections)

关于sql - 如何使用一个 SQL 查询从多个日期范围中提取数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39985369/

相关文章:

sql - 在 T-SQL 中创建会计日历

mysql - 选择字段匹配的数据

MySql 不能使列 auto_increment

xml - Postgresql xpath 搜索属性和元素组合

postgresql - 修改 Devise 以支持 UUID 主键

sql - 在单个 SQL 语句中按行进行 IN BETWEEN 比较

MySQL 根据列值的优先级进行选择

sql - 在 Oracle 中选择分组集中的最新数据

postgresql - 扩展 Postgresql 列中的日期范围

mysql - 在 Postgres 的 having 子句中引用一个选择聚合列别名