INSERT INTO niffler.person_grade (name, subject, mark) VALUES('张三', '数学', 66); INSERT INTO niffler.person_grade (name, subject, mark) VALUES('张三', '语文', 99); INSERT INTO niffler.person_grade (name, subject, mark) VALUES('李四', '数学', 77); INSERT INTO niffler.person_grade (name, subject, mark) VALUES('李四', '政治', 80);
id
name
subject
mark
1
张三
数学
66
2
张三
语文
99
3
李四
数学
77
4
李四
政治
80
以subject列为表头,展示每个人的成绩
1 2 3 4 5
select name , (case subject when'数学'then mark end) as'数学' , (case subject when'语文'then mark end) as'语文' , (case subject when'政治'then mark end) as'政治' from person_grade;
select name , MAX(case subject when'数学'then mark end) as'数学' , MAX(case subject when'语文'then mark end) as'语文' , MAX(case subject when'政治'then mark end) as'政治' from person_grade groupby name ;
SET@sql=NULL; SELECT GROUP_CONCAT(DISTINCT CONCAT( 'max(case when subject = ''', subject, ''' then mark end) ', subject ) ) INTO@sql FROM Meeting; SET@sql= CONCAT('SELECT Meeting_id, ', @sql, ' FROM Meeting GROUP BY Meeting_id');
SELECT GROUP_CONCAT(DISTINCT CONCAT( 'max(case when subject = ''', subject, ''' then mark end) as ', subject ) ) FROM Meeting;
执行结果:
1
max(case when subject = '政治' then mark end) as 政治,max(case when subject = '数学' then mark end) as 数学,max(case when subject = '语文' then mark end) as 语文
是不是已经看出来了,就是为了动态得到行,不是由我们手动指定的,而是通过脚本自动生成、拼接而来。
然后把拼接后的结果 INTO @sql
再通过
1 2 3
SET@sql= CONCAT('SELECT name, ', @sql, ' FROM person_grade GROUP BY name');
拼成完整的SQL
1 2 3 4 5 6
SELECT name, max(casewhen subject ='政治'then mark end) as 政治, max(casewhen subject ='数学'then mark end) as 数学, max(casewhen subject ='语文'then mark end) as 语文 FROM person_grade GROUPBY name