将mysql行转换为带有数据的自定义列

时间:2017-01-29 07:34:32

标签: mysql sql pivot transpose

我在mysql中有以下表格

emp_id          month           salary
1               Jan             2000
1               Feb             2000
1               March           2000
2               Jan             3000
2               Feb             3000
2               March           3000

我想得到如下结果:

emp_id   Jan_sal    feb_sal     Mar_sal
1           2000    2000        2000
2           3000    3000        3000

我的查询:

select emp_id,
(case when month = 'Jan' then salary else NUll end ) jan_sal,
(case when month = 'Feb' then salary else NUll end ) feb_sal,
(case when month = 'March' then salary else NUll end ) march_sal
from emp group by emp_id;

但我得到的输出为:

emp_id jan_sal  feb_sal march_sal
1      2000     NULL    NULL
2      3000     NULL    NULL

不确定我的查询是否正确。 任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:1)

您希望在案例陈述中使用SUMMAX等汇总函数

select emp_id,
sum(case when month = 'Jan' then salary else NUll end ) jan_sal,
sum(case when month = 'Feb' then salary else NUll end ) feb_sal,
sum(case when month = 'March' then salary else NUll end ) march_sal
from emp
group by emp_id;

如果同一员工有多个工资(可能是其他福利等),那么您必须决定是否要添加所有工资或仅采用最大值并使用SUM或MAX。

答案 1 :(得分:1)

使用MAX()功能进行转动:

SELECT emp_id,
       MAX(CASE WHEN month = 'Jan'   THEN salary END) AS jan_sal,
       MAX(CASE WHEN month = 'Feb'   THEN salary END) AS feb_sal,
       MAX(CASE WHEN month = 'March' THEN salary END) AS march_sal
FROM emp
GROUP BY emp_id;

这假设每个员工每月只有一个工资条目。如果可能有多个条目,则使用原始CASE表达式时应使用SUM()代替MAX()