将 mysql 行转换为包含数据的自定义列

Transposing mysql rows into customized column with data

我在 mysql

中关注 table
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

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

您想在 case 语句中使用像 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。

使用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;

这里假设每个员工每个月只有一个工资条目。如果可能有多个条目,则应使用带有 SUM() 的原始 CASE 表达式而不是 MAX().