You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用单条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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 15:25:01