ejs*_*ncy 1 mysql syntax join pivot-table
假设我有一个类似于以下的数据库:
表student_info:
id name
111 jon
112 dan
113 david
...
Run Code Online (Sandbox Code Playgroud)
和表分数:
item_id student_id score
01 111 37
02 111 45
01 112 55
02 112 44
01 113 66
02 113 45
...
Run Code Online (Sandbox Code Playgroud)
是否可以执行mysql查询来生成下表?:
Student_Name ITEM_1_SCORE ITEM_2_SCORE
jon 37 45
dan 55 44
david 66 45
...
Run Code Online (Sandbox Code Playgroud)
如果是这样,语法是什么?我不知道这是一个连接操作还是其他什么?
谢谢.
如果您只有两个值item_id,那么硬编码值就可以了.例
SELECT a.Name AS Student_Name,
MAX(CASE WHEN item_id = '01' THEN b.score END) Item_1_Score,
MAX(CASE WHEN item_id = '02' THEN b.score END) Item_2_Score
FROM student_info a
LEFT JOIN scores b
ON a.id = b.student_ID
GROUP BY a.Name
Run Code Online (Sandbox Code Playgroud)
否则,当你有不知道的分数时,a Dynamic SQL是首选.
SELECT GROUP_CONCAT(DISTINCT
CONCAT('MAX(CASE WHEN item_id = ''',
item_id,
''' THEN Score END) AS ',
CONCAT('`Item_', item_id, '_Score`')
)) INTO @sql
FROM scores;
SET @sql = CONCAT('SELECT a.Name AS Student_Name, ', @sql, '
FROM student_info a
LEFT JOIN scores b
ON a.id = b.student_ID
GROUP BY a.Name');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
Run Code Online (Sandbox Code Playgroud)
两个查询都将输出相同的内容
??????????????????????????????????????????????
? STUDENT_NAME ? ITEM_1_SCORE ? ITEM_2_SCORE ?
??????????????????????????????????????????????
? dan ? 55 ? 44 ?
? david ? 66 ? 45 ?
? jon ? 37 ? 45 ?
??????????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)