mysql - 如何在 MySQL 中对表进行透视

标签 mysql sql pivot-table

我有一个关于如何在 MySQL 中旋转表的问题。 我有一个数据集,像这样的列:

ID   Name     job_title
1    Sam       Fireman
2    Tomas     Driver
3    Peter     Fireman
4    Lisa      Analyst
5    Marcus    Postman
6    Stephan   Analyst
7    Mary      Research Manager
8    Albert    Analyst
9    Chen      Driver
...etc...

我想生成一个这样的表:

Fireman  Driver   Analyst  Postman   Research Manager ...
Sam     Tomas     Lisa     Marcus     Mary
Peter   Chen      Stephan  (someone)  (someone)...
....etc...

因为这只是数据集中的样本,所以我可能不知道数据集中有多少不同的职位。目标是列出不同职位列中的每个人。

有什么方法可以做到吗?或者是否可以在 MySQL 中生成这样的表? 一位工程师告诉我可以通过创建 View 来完成,但我不知道如何做。看了一些书,还是一头雾水。

欢迎任何想法和 SQL 查询指南!

最佳答案

有 3 件事需要考虑 1) 如何动态生成一堆最大值(case when 2)分配一些东西来分组 case when's by - 在这种情况下我使用变量生成行号 3)你的一些职位名称包含空白,我在生成列标题时将其删除

set @sql = 
            (select concat('select ', gc,            ' from 
             (select name,job_title,
                if (job_title <> @p, @rn:=1 ,@rn:=@rn+1) rn,
                @p:=job_title p
                from t
                cross join (select @rn:=0,@p:=null) r
                order by job_title
              ) s group by rn;') from
            (select 
                group_concat('max(case when job_title = ', char(39),job_title ,char(39),' then name else char(32) end ) as ',replace(job_title,char(32),'')) gc
                from
                (
                select distinct job_title from t
                ) s
                ) t
             )
;           

生成这段sql代码

select max(case when job_title = 'Fireman' then name else char(32) end ) as Fireman,
        max(case when job_title = 'Driver' then name else char(32) end ) as Driver,
        max(case when job_title = 'Analyst' then name else char(32) end ) as Analyst,
        max(case when job_title = 'Postman' then name else char(32) end ) as Postman,
        max(case when job_title = 'Research Manager' then name else char(32) end ) as ResearchManager
         from 
             (select name,job_title,
                if (job_title <> @p, @rn:=1 ,@rn:=@rn+1) rn,
                @p:=job_title p
                from t
                cross join (select @rn:=0,@p:=null) r
                order by job_title
              ) s group by rn;

可以提交动态sql

prepare sqlstmt from @sql;
execute sqlstmt;
deallocate prepare sqlstmt;

结果

+---------+--------+---------+---------+-----------------+
| Fireman | Driver | Analyst | Postman | ResearchManager |
+---------+--------+---------+---------+-----------------+
| Sam     | Tomas  | Lisa    | Marcus  | Mary            |
| Peter   | Chen   | Stephan |         |                 |
|         |        | Albert  |         |                 |
+---------+--------+---------+---------+-----------------+
3 rows in set (0.00 sec)

关于mysql - 如何在 MySQL 中对表进行透视,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48857955/

相关文章:

php - 如何解压 txt.gz 文件并使用 php 存储到数据库中

java - 显示 0 的行数

sql - 如何在 hive 中提取字符串的一部分

excel - 根据某列中的目标词列表提取行

python - 数据透视表不使用数据框中的日期时间索引创建

Mysql - 将一个数字分成单独的列,然后按每个单独的列求和

mysql - 将具有相同状态的行分组,直到状态更改

mysql - mysql 中的 NULL 拒绝

mysql - 获取数据子集到 qplot

matlab - 根据 Matlab 中单元格的现有列创建新变量