MySQL 将多行表转换为唯一行表

标签 mysql pivot

我在 MySQL 中有以下结果数据表。我想将其从每个 UPN 每个主题等级的一行转换为每个 UPN 的一行,因此下表:

UPN        Collection      Subject        Grade
1          Target          English        5
1          Current         English        6
1          Target          Maths          7
1          Current         Maths          7
1          Target          Art            6
1          Current         Art            6
2          Target          English        5
2          Current         English        5
2          Target          Maths          6
2          Current         Maths          7
2          Target          History        6
2          Current         History        5

应该转向下表:

UPN    English Current    English Target    Maths Current    Maths Target    Art Current    Art Target    History Current    History Target
1      6                  5                 7                7               6              6             NULL               NULL
2      5                  5                 7                6               NULL           NULL          5                  6

请注意,在第二个表中,UPN 行必须是唯一的,因此没有包含 NULL 的重复 UPN 行。

此外,如果 UPN 没有学生,则单元格值应为 NULL。

SQL Fiddle

最佳答案

试试下面的查询

SELECT t1.UPN,
IFNULL((SELECT MAX(t2.Grade) FROM `results` AS t2 WHERE t2.UPN = t1.UPN AND t2.`Collection` = 'Current' AND t2.`Subject` = 'English'),NULL) AS 'English Current',
IFNULL((SELECT MAX(t2.Grade) FROM `results` AS t2 WHERE t2.UPN = t1.UPN AND t2.`Collection` = 'Target' AND t2.`Subject` = 'English'),NULL) AS 'English Target', 
IFNULL((SELECT MAX(t2.Grade) FROM `results` AS t2 WHERE t2.UPN = t1.UPN AND t2.`Collection` = 'Current' AND t2.`Subject` = 'Maths'),NULL) AS 'Maths Current',
IFNULL((SELECT MAX(t2.Grade) FROM `results` AS t2 WHERE t2.UPN = t1.UPN AND t2.`Collection` = 'Target' AND t2.`Subject` = 'Maths'),NULL) AS 'Maths Target',
IFNULL((SELECT MAX(t2.Grade) FROM `results` AS t2 WHERE t2.UPN = t1.UPN AND t2.`Collection` = 'Current' AND t2.`Subject` = 'Art'),NULL) AS 'Art Current',
IFNULL((SELECT MAX(t2.Grade) FROM `results` AS t2 WHERE t2.UPN = t1.UPN AND t2.`Collection` = 'Target' AND t2.`Subject` = 'Art'),NULL) AS 'Art Target',
IFNULL((SELECT MAX(t2.Grade) FROM `results` AS t2 WHERE t2.UPN = t1.UPN AND t2.`Collection` = 'Current' AND t2.`Subject` = 'History'),NULL) AS 'History Current',
IFNULL((SELECT MAX(t2.Grade) FROM `results` AS t2 WHERE t2.UPN = t1.UPN AND t2.`Collection` = 'Target' AND t2.`Subject` = 'History'),NULL) AS 'History Target'
FROM `results` AS t1 GROUP BY t1.`UPN`

关于MySQL 将多行表转换为唯一行表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39202893/

相关文章:

php - 使用 PHP 获取 CSV 文件的第一行并使用数据创建 MySQL 表

MySQL - 如何有效地获取 ID 最低的行?

mysql - 对不同表中的相同命名列进行计数和分组(where 子句仅来自一个表)

mysql - SQL 对一列中不同值的日期计数

pandas - 使用 value_counts() 在 groupby 结果之后透视数据帧

mysql - 帮助!为什么 MySql 突然停止了?

mysql - SQL 查找并替换字符串的一部分

python - 在没有数据透视表的情况下展平 pandas DataFrame

mysql - 按月透视 MySQL 中的数据

tsql - T-SQL枢轴?根据行值创建表格列的可能性