如何解决postgres 选择查询中更简单的聚合函数
我必须在我的选择查询中运行一些计算来获取动态值,例如已售库存项目收到的利润。公式为 (price minus discounts) - (total expenses) = profit
我的查询工作正常,但我有很多这样的行,所以其他人完全无法阅读。有没有办法为我的各种聚合函数或强制转换分配变量或其他东西?
这是我的查询的更简单版本:
select
...
(sum(cast(ti.price as integer)) - sum(floor(cast(ti.discount as float)))) - sum(cast("exp".price as integer))) as profit,...
from inventory as inv
left join transaction_item as ti on ti.inventory_id = inv.id
left join expense as exp on exp.inventory_id = inv.id
...
where
...
group by inv.id
上下文:
我想做什么而不是那个长的函数链:
((price_total - total_discounts) - total_expenses) as profit
...我在某处定义每个变量的地方。这是可能的还是我需要接受这个查询会很混乱?
解决方法
您可以使用 CTE(公用表表达式)生成具有名称和类型的计算列。然后,您可以在后续 CTE 或主查询中使用它们。
下面的示例定义了一个名为 inv_total
的 CTE,我们稍后会在主查询中使用它。此 CTE 具有三个计算列 price_total
、total_discounts
和 total_expenses
:
with
inv_total as ( -- first we define a CTE
select
...
sum(cast(ti.price as integer)) as price_total,sum(floor(cast(ti.discount as float))) as total_discount,sum(cast("exp".price as integer)) as total_expenses
...
from inventory as inv
left join transaction_item as ti on ti.inventory_id = inv.id
left join expense as exp on exp.inventory_id = inv.id
...
where
...
group by inv.id
)
select -- now the main query uses the CTE
price_total - total_discounts - total_expenses as profit
from inv_total;
您可以在多个步骤中链接 CTE(用逗号分隔它们)来计算临时值并继续处理。上面的例子只有一个步骤。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。