微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

postgres 选择查询中更简单的聚合函数

如何解决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

上下文:

  • ti一个 transaction_item 表(pricediscount 是文本 列)
  • inv 是库存项目表
  • exp 是费用表 (price一个文本列)

我想做什么而不是那个长的函数链:

((price_total - total_discounts) - total_expenses) as profit

...我在某处定义每个变量的地方。这是可能的还是我需要接受这个查询会很混乱?

解决方法

您可以使用 CTE(公用表表达式)生成具有名称和类型的计算列。然后,您可以在后续 CTE 或主查询中使用它们。

下面的示例定义了一个名为 inv_total 的 CTE,我们稍后会在主查询中使用它。此 CTE 具有三个计算列 price_totaltotal_discountstotal_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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?