如何通过SQL查询对关联表数据透视并求和PF与PT总额?
SQL查询解决方案
针对需求,这里提供两种可行的查询方案,解决PF+PT总额的求和问题:
方案一:条件聚合直接关联
通过CASE语句筛选PF和PT的金额,结合SUM()函数直接计算总额,再关联表B获取员工信息和实发工资:
SELECT B.emp AS 员工编号, SUM(CASE WHEN A.component = 'PF' THEN A.amount ELSE 0 END) + SUM(CASE WHEN A.component = 'PT' THEN A.amount ELSE 0 END) AS PF_PT总额, B.netpay AS 实发工资 FROM 表B B INNER JOIN 表A A ON B.slip = A.slip WHERE A.component IN ('PF', 'PT') -- 只筛选PF和PT记录,提升效率 GROUP BY B.emp, B.slip, B.netpay;
- 注:
GROUP BY需包含所有非聚合字段,确保每个薪资单的记录被正确分组;WHERE子句可过滤无关的component,减少计算量。
方案二:先分组求和再关联
先通过CTE(公共表达式)计算每个薪资单的PF+PT总额,再与表B关联,逻辑更清晰:
WITH 薪资单税费汇总 AS ( SELECT slip, SUM(amount) AS PF_PT总额 FROM 表A WHERE component IN ('PF', 'PT') GROUP BY slip ) SELECT B.emp AS 员工编号, 税费.PF_PT总额, B.netpay AS 实发工资 FROM 表B B INNER JOIN 薪资单税费汇总 税费 ON B.slip = 税费.slip;
- 这种方式适合表A数据量较大的场景,提前汇总数据能提升查询效率。
关键注意点
CONCAT()是字符串拼接函数,不能用于数值求和,求和必须用SUM();- 确保表A和表B的
slip字段是有效的关联键,避免出现数据重复或关联错误。
内容的提问来源于stack exchange,提问作者umarless
相关产品推荐
相关产品推荐

