如何实现MySQL复杂查询:员工物品金额的行转列展示
解决方案
你可以通过左连接关联员工表和物品表,结合条件判断与聚合函数实现行转列的需求,同时处理无对应记录时显示0的场景:
SELECT e.RUT, e.Name, COALESCE(SUM(CASE WHEN i.Item_Id = 3 THEN i.Amount ELSE 0 END), 0) AS Item_3_amount, COALESCE(SUM(CASE WHEN i.Item_Id = 8 THEN i.Amount ELSE 0 END), 0) AS Item_8_amount, '2022-10' AS Period FROM Employees e LEFT JOIN Items i ON e.RUT = i.RUT AND i.Period = '2022-10' GROUP BY e.RUT, e.Name;
关键部分说明:
- LEFT JOIN:保证所有员工(哪怕没有对应物品记录)都能出现在结果里
- CASE WHEN 分支判断:分别匹配Item_Id=3和8的记录,提取对应金额,其他情况返回0
- SUM聚合:应对同一员工同一物品可能有多条记录的情况,汇总金额;无匹配记录时SUM返回NULL
- COALESCE函数:把NULL替换成0,满足无对应记录时显示0的要求
- 固定Period字段:因为需求结果里Period统一为2022-10,直接指定即可;如果需要动态获取周期,可改为
COALESCE(MAX(i.Period), '2022-10')
实际执行结果:
根据你提供的表数据,执行后会得到如下结果(注:你给出的期望结果中Luis的Item_3_amount数值有误,实际应为0):
RUT Name Item_3_amount Item_8_amount Period 15897554-4 Luis 0 50000 2022-10 18897554-9 Ramon 80000 0 2022-10
内容的提问来源于stack exchange,提问作者Jis
相关产品推荐
相关产品推荐

