如何用单条PostgreSQL语句显示明细行并展示Payout总和?
问题与解决方案
问题场景
我通过Node.js将CSV文件上传至PostgreSQL,CSV原始数据如下:
Employee ID UID Name Base Pay Payout 987 123 Test 71777 200 987 123 Test 71788 250
需求为保留两行Base Pay不同的明细行,同时每行展示该Employee ID对应的Payout总和(即450),期望输出效果如下:
Employee ID UID Name Base Pay Payout 987 123 Test 71777 450 987 123 Test 71788 450
当前使用以下SQL语句仅返回单行,询问是否可用单条SQL实现需求:
SELECT employee_id,uid, employee_name, SUM(CAST(COALESCE(NULLIF(payout, ''), '0') AS decimal)) AS amount FROM employee_table where employee_id = '987' GROUP BY employee_id, uid, employee_name
解决方案
可以用PostgreSQL的窗口函数SUM() OVER()实现,无需分组聚合(分组会合并行),窗口函数能在保留原始行结构的同时,按指定维度计算总和。
修改后的SQL语句:
SELECT employee_id, uid, employee_name, base_pay, SUM(CAST(COALESCE(NULLIF(payout, ''), '0') AS decimal)) OVER (PARTITION BY employee_id, uid, employee_name) AS payout FROM employee_table WHERE employee_id = '987'
关键说明
PARTITION BY employee_id, uid, employee_name:按员工ID、UID、姓名分组,确保同一员工的所有行都能获取到对应的Payout总和- 窗口函数不会合并原始明细行,因此
Base Pay不同的两行数据会被保留,且每行都会显示该员工的Payout总和
内容的提问来源于stack exchange,提问作者sfdclearner
相关产品推荐
相关产品推荐

