MySQL:根据另一列的值对某一列进行求和

4
我想对基于另一列的值为“this/that”的列求和。这是我的表结构。
id  leave_hours leave_type overtime_hours employee_id
1     7.6          1           0               3
2      5           2           0               3
3      0           0           2.3             3

我已经有这个查询了,但我需要一个列只在请假类型是1时求和,并且如果请假类型是2也求和。

SELECT employee_id, SUM(overtime_hours) AS ot_hrs, SUM(leave_hours if leave_type == 1) AS  
       leave_1, SUM(leave_hours if leave_type == 2) AS leave_2
FROM table
GROUP BY employee_id

结果应该是:

employee_id  ot_hrs leave_1  leave_2
    3          2.3    7.6       5

感谢您的输入。

2
你想要求和什么? - Nick
1
你的描述不足以提供更好的解决方案。 - Blasanka
编辑了问题以反映结果和总和查询。 - Ronald
2个回答

4
你需要使用条件聚合来单独计算不同的 leave_hours 总和:
SELECT employee_id, 
       SUM(overtime_hours) AS ot, 
       SUM(CASE WHEN leave_type = 1 THEN leave_hours ELSE 0 END) AS leave_1, 
       SUM(CASE WHEN leave_type = 2 THEN leave_hours ELSE 0 END) AS leave_2
FROM `table`
GROUP BY employee_id

输出:

employee_id ot      leave_1     leave_2
3           2.3     7.6         5

在dbfiddle上演示

请注意,如果您使用浮点数存储小时数,则可能需要使用ROUND函数来取整结果。


2
在这种情况下,最好使用NULL而不是0。这样,您就不会存在一些记录,这些记录不会将结果从NULL更改为0。 - ysth
不需要圆括号,但这个可以工作。只需编辑它而不加圆括号,我将把它设置为被接受的答案。 - Ronald
1
Dbfiddle上的演示使用FLOAT存储数字,由于2.3和7.6不能精确表示为浮点数,因此我需要对它们进行四舍五入,并显示其近似值,而不是显示类似于2.29999999837424等的数字。 - Nick
1
@Ronald 舍入已移除。 - Nick
1
啊。大多数情况下最好使用十进制而不是浮点数。 - ysth
1
@ysth 确实。当您只输入表数据时,db-fiddle 的默认模式始终是选择 FLOAT,我只需要记得更改它... - Nick

1
你可以在 case when 中使用 max()
SELECT employee_id, 
       max(overtime_hours) AS ot, 
       max(CASE WHEN leave_type = 1 THEN leave_hours  END) AS leave_1, 
       max(CASE WHEN leave_type = 2 THEN leave_hours END) AS leave_2
FROM  table_name
GROUP BY employee_id

输出

employee_id     ot     leave_1       leave_2
3              2.3  7.599999904632568   5

1
我可以知道使用MAX的原因吗? - Ronald
@Ronald 你想要使用 max() 轻松完成透视,请访问 https://www.db-fiddle.com/f/pNw42Q4yRiMhA7qFGTEZ4R/2。 - Zaynul Abadin Tuhin
@Ronald 我猜是因为你的数据只显示了每个请假类型/员工的一条记录;max 然后相当于 sum。但我猜你可能会有多个。 - ysth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接