mysql - 在 SQL 中将表与值和其他表与列名组合

标签 mysql pivot-table

我有 5 张 table 。一个包含个人详细信息,两个包含后两者的列名,另外两个包含值。

T1: people
-----------------
|name|age|gender|
-----------------
|Alice|22 | f   |
|Bob  |33 | m   |
-----------------

T2: skillgroup names
--------------
|id | name    |
---------------
| 1 | sgn1    |
| 2 | sgn2    |
|.. |  ...    |
| 63| sgn63   |
---------------

T3: skill names
--------------
|id | name    |
---------------
|101 | sk101  |
|102 | sk102  |
|..  |  ...   |
|180 | sk180  |
---------------

T4: skillgroup person
--------------------------------
|name  | skillgroupID | value  |
--------------------------------
|Alice | 1            | 40     |
|Alice | 2            | 38     |
|...   | ..           | ..     |
|Bob   | 63           | 25     |
--------------------------------

T5: skill person
---------------------------
|name  | skillID | value  |
---------------------------
|Alice | 101     | 80     |
|Alice | 102     | 70     |
|...   | ..      | ..     |
|Bob   | 180     | 90     |
---------------------------

但是,我想要一张这样的表:

    ------------------------------------------------------------
    |name |age|gender|sgn1|sgn2|...|sgn63|sk101|sk102|...|sk180|
    ------------------------------------------------------------
    |Alice| 22| f    | 40 | 38 |...| ... | 80  |  70 |...| ... |
    |Bob  | 33| m    | ...| ...|...|  25 | ... | ... |...| 90  |
    ------------------------------------------------------------

我该怎么做?据我所知,每个人的技能组和技能都是相同的,这意味着每个人拥有相同数量的技能组和技能。

最佳答案

以下 mysql 查询解决了您的特定问题:

SELECT
  p.name,
  p.age,
  p.gender,
  MAX(IF(skgn.name = 'sgn1', skgp.value, NULL)) AS sgn1,
  MAX(IF(skgn.name = 'sgn2', skgp.value, NULL)) AS sgn2,
  MAX(IF(skgn.name = 'sgn63', skgp.value, NULL)) AS sgn63,
  MAX(IF(skn.name = 'sk101', skp.value, NULL)) AS sk101,
  MAX(IF(skn.name = 'sk102', skp.value, NULL)) AS sk102,
  MAX(IF(skn.name = 'sk180', skp.value, NULL)) AS sk180
FROM people AS p
INNER JOIN skillgroup_person AS skgp ON p.name = skgp.name
INNER JOIN skill_person AS skp ON p.name = skp.name
INNER JOIN skillgroup_names AS skgn ON skgp.skillgroupID = skgn.id
INNER JOIN skill_names AS skn ON skp.skillID = skn.id
GROUP BY p.name, p.age, p.gender;

参见 DEMO

由于此解决方案不是动态的,如果您有很多列要转换为行数据,最好使用动态数据透视表解决方案 at this SO answer

关于mysql - 在 SQL 中将表与值和其他表与列名组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48559188/

相关文章:

mysql - RESTRICT 和 NO ACTION 有什么区别?

php - MySQL 将表与结果中的原始信息连接起来

php - 从指定边界内的数据库获取坐标( map 角)

基于事务计数的 MySql 数据透视表

python - 数据透视表中附加的行/列/总计的总和

php - 返回意外值 (MAX(id))

mysql - SQL 查询问题 - 未知列错误

ASP.NET - 显示数据透视表的理想控件

mysql - 如何在 MySQL 中返回数据透视表输出?

linq - 是否可以使用 LINQ 透视数据?