Postgres聚合函数选型:按经纪商及品种汇总交易并计算累计总额
PostgreSQL 聚合函数实现交易数据多维度汇总
一、核心需求
- 按经纪商+品种维度生成汇总报表:统计交易总数量(Qty之和)、总金额(TotalValue=Value之和),可选展示平均价格(AvgPrice)
- 按经纪商维度生成累计汇总报表:统计该经纪商下所有品种的总数量、累计总金额
二、样本明细数据
假设交易明细表名为trade_details,结构及测试数据如下:
CREATE TABLE trade_details ( broker VARCHAR(50), product VARCHAR(50), qty INT, value NUMERIC(12,2) ); INSERT INTO trade_details VALUES ('BrokerA', 'Gold', 10, 18000.00), ('BrokerA', 'Gold', 5, 9000.00), ('BrokerA', 'Silver', 20, 4000.00), ('BrokerB', 'Gold', 8, 14400.00), ('BrokerB', 'Silver', 15, 3000.00), ('BrokerB', 'Oil', 12, 7200.00);
三、按经纪商+品种汇总报表实现
使用SUM()聚合函数计算总数量和总金额,通过GROUP BY broker, product按双维度分组;平均价格通过总金额除以总数量计算(比直接用AVG()更贴合业务逻辑):
SELECT broker, product, SUM(qty) AS total_qty, SUM(value) AS total_value, ROUND(SUM(value)/SUM(qty), 2) AS avg_price FROM trade_details GROUP BY broker, product ORDER BY broker, product;
预期输出
| broker | product | total_qty | total_value | avg_price |
|---|---|---|---|---|
| BrokerA | Gold | 15 | 27000.00 | 1800.00 |
| BrokerA | Silver | 20 | 4000.00 | 200.00 |
| BrokerB | Gold | 8 | 14400.00 | 1800.00 |
| BrokerB | Oil | 12 | 7200.00 | 600.00 |
| BrokerB | Silver | 15 | 3000.00 | 200.00 |
四、按经纪商累计总额汇总报表实现
仅按broker分组,用SUM()汇总全品种的数量和金额:
SELECT broker, SUM(qty) AS total_qty_all_products, SUM(value) AS total_value_all_products FROM trade_details GROUP BY broker ORDER BY broker;
预期输出
| broker | total_qty_all_products | total_value_all_products |
|---|---|---|
| BrokerA | 35 | 31000.00 |
| BrokerB | 35 | 24600.00 |
关键函数说明
SUM():核心聚合函数,用于数值型字段的求和计算,是实现数量、金额汇总的基础- 关于AvgPrice:业务上的平均价格应为总金额除以总数量,而非单条记录价格的平均值,因此用
SUM(value)/SUM(qty)计算更准确
内容的提问来源于stack exchange,提问作者marcos sicat
相关产品推荐
相关产品推荐

