PostgreSQL:基于其他列的汇总结果创建生成列的最佳方法

PostgreSQL:基于其他列的汇总结果创建生成列的最佳方法,postgresql,Postgresql,我是PostgreSQL的新手,所以这个问题对于有经验的人来说可能是最基本的 我使用名为Activity的表创建了一个测试数据库,如下所示: Manufacturer Region Model Orders Sales BMW Americas 3 Series 58390 47092 BMW Americas 4 Series 31938

我是PostgreSQL的新手,所以这个问题对于有经验的人来说可能是最基本的

我使用名为Activity的表创建了一个测试数据库,如下所示:

Manufacturer     Region       Model         Orders     Sales   
BMW              Americas     3 Series      58390      47092
BMW              Americas     4 Series      31938      28474
BMW              Americas     5 Series      13730      10837
BMW              Americas     7 Series       9372       6493
Audi             Europe       A3            60483      50381
Audi             Europe       A4            49302      39303
Audi             Europe       A5            50319      49001
Audi             Europe       A6             9101       4688
Manufacturer     Region       Model         Orders     Sales     OrdersToSales  
BMW              Americas     3 Series      58390      47092      <null>
BMW              Americas     4 Series      31938      28474      <null>
BMW              Americas     5 Series      13730      10837      <null>
BMW              Americas     7 Series       9372       6493      <null>
BMW              Americas     <null>        <null>     <null>    1.22104
Audi             Europe       A3            60483      50381      <null>
Audi             Europe       A4            49302      39303      <null>
Audi             Europe       A5            50319      49001      <null>
Audi             Europe       A6             9101       4688      <null>
Audi             Europe       <null>        <null>     <null>    1.18017
我想创建一个名为OrdersToTradesRatio的生成和存储列,它是按地区汇总的订单与销售额的比率

使用上述数据,OrdersToSales将为:

OrdersToSales
1.22104         <----- Mercedes --- (58390 + 31938 + 13730 + 9372) / (47092 + 28474 + 10837 + 6493)
1.18017         <----- Audi ------- (60483 + 49302 + 50319 + 9101) / (50381 + 39303 + 49001 + 4688)
是否可以如上所示创建此OrdersToSales列

提前谢谢

试试这个:

select "Manufacturer","Region","Model","Orders","Sales", null as "OrdersToSales" from "Activity"

union all

select "Manufacturer", "Region", null,null,null, round(sum("Orders")/sum("Sales"),5) 
from "Activity" 
group by "Manufacturer", "Region"

order by "Manufacturer","Region","Model", "OrdersToSales" desc

如果符合您的要求,您应该尝试汇总

您的PostgreSql版本是什么?不要存储这样的列,如果修改其他行,该列将变得无效。这样的冗余是一个问题。计算SELECT上的值。@Akhilesh Mishra-我使用的是PostgreSQL 12.3版。@LaurenzAlbe完全同意。这应该是Select only的结果。不要将其存储在表中。@请尝试汇总分组。您将获得略有不同的输出,但它与您的情况相关。您应该在此处使用sum作为窗口函数,而不使用GROUP BY,然后您可以获得OP想要的输出。按原样运行@Akhilesh Mishra的代码,我会收到一条错误消息,说明:错误:关系活动不存在第1行:选择*,作为ordertosales from activity ^SQL state:42P01 Character:39活动空表名大写是否需要用双引号括起来和/或以public开头。?再一次,我对这一点是全新的,并且仍然习惯于语法!此外,列名是否需要大写?是的,如果您的表/架构/列名不是小写,则必须使用双引号,即活动