标签:进阶 max name score user splice Mysql subject
如图一,通过sq了实现图二:
图一如下:
图二如下:
附建表语句&初始化数据语句:
CREATE TABLE `sc` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `user_name` varchar(32) NOT NULL DEFAULT '', `subject` varchar(32) NOT NULL DEFAULT '', `score` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;insert into sc(id,user_name,subject,score) values (1,"张三","语文",80),(2,"张三","数学",90),(3,"张三","英语",70),(4,"张三","生物",85), (5,"李四","语文",80),(6,"李四","数学",90),(7,"李四","英语",70),(8,"李四","生物",85);
以下有简单易懂的&万能通用的两种写法:
1.简单易懂的一种写法,由于一名学生一门课只有一个分数,所以下面sql中max函数完全可以换为sum等其他聚合函数。
select `user_name`, max(case `subject` when '语文' then IFNULL(`score`, 0) else 0 end) as '语文', max(case `subject` when '数学' then IFNULL(`score`, 0) else 0 end) as '数学', max(case `subject` when '英语' then IFNULL(`score`, 0) else 0 end) as '英语', max(case `subject` when '生物' then IFNULL(`score`, 0) else 0 end) as '生物'from `sc`group by `user_name`;
运行结果:
2.不需要提前知道有多少门课程,动态生成列,万能通用的一种写法。
set @splice_sql = null;SELECT GROUP_CONCAT(DISTINCT CONCAT('max(if(subject=''',subject,''', score, 0)) as ''',subject, '''')) into @splice_sqlfrom sc;set @splice_sql = CONCAT('select user_name,', @splice_sql, ' from sc group by user_name');prepare bella_test from @splice_sql;execute bella_test;DEALLOCATE prepare bella_test;
运行结果
标签:进阶,max,name,score,user,splice,Mysql,subject 来源: https://blog.51cto.com/u_15222067/2809345
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。