sql行转列,列转行

行转列,列转行是我们在开发过程中经常碰到的问题。行转列一般通过CASE WHEN 语句来实现,也可以通过 SQL SERVER 2005 新增的运算符PIVOT来实现。用传统的方法,比较好理解。层次清晰,而且比较习惯。 但是PIVOT 、UNPIVOT提供的语法比一系列复杂的SELECT…CASE 语句中所指定的语法更简单、更具可读性
下面只简单介绍一下case when的方式

CREATE TABLE `student` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `user_name` varchar(100) DEFAULT NULL,
  `subject` varchar(100) DEFAULT NULL,
  `score` float DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO student(user_name,SUBJECT,score) VALUES('Nick','语文',80);
INSERT INTO student(user_name,SUBJECT,score) VALUES('Nick','数学',90);
INSERT INTO student(user_name,SUBJECT,score) VALUES('Nick','英语',70);
INSERT INTO student(user_name,SUBJECT,score) VALUES('Nick','生物',85);

INSERT INTO student(user_name,SUBJECT,score) VALUES('Kent','语文',80);
INSERT INTO student(user_name,SUBJECT,score) VALUES('Kent','数学',90);
INSERT INTO student(user_name,SUBJECT,score) VALUES('Kent','英语',70);
INSERT INTO student(user_name,SUBJECT,score) VALUES('Kent','生物',85);

如果我想知道每位学生的每科成绩,而且每个学生的全部成绩排成一行,这样方便我查看、统计,导出数据

SELECT 
    user_name,
    MAX(CASE SUBJECT WHEN '语文' THEN score ELSE 0 END) AS '语文',
    MAX(CASE SUBJECT WHEN '数学' THEN score ELSE 0 END) AS '数学',
    MAX(CASE SUBJECT WHEN '英语' THEN score ELSE 0 END) AS '英语',
    MAX(CASE SUBJECT WHEN '生物' THEN score ELSE 0 END) AS '生物'
FROM student
GROUP BY user_name;

查询结果如图所示,这样我们就能很清楚的了解每位学生所有的成绩了


QQ截图20170217143730.jpg

其实行转列,关键是要理清逻辑,而且对分组(Group by)概念比较清晰

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Oracle行转列、列转行的Sql语句总结 多行转字符串这个比较简单,用||或concat函数可以实现SQL Co...
    王滕辉阅读 6,160评论 0 3
  • 50个常用的sql语句Student(S#,Sname,Sage,Ssex) 学生表Course(C#,Cname...
    哈哈海阅读 1,256评论 0 7
  • 本文导读:T-SQL语句中,Pivot运算符用于在列和行之间对数据进行旋转或透视转换,PIVOT命令可以实现数据表...
    星期五与糖糖阅读 1,247评论 0 3
  • 新年第一天,说不上多么的兴奋,因为要到医院看望病中的老妈妈。听她述说病痛,听她说想在春节前出院的愿望~探视时间结束...
    柿意阅读 391评论 0 3
  • 马上就是中秋了,家里迎来了最后一位接班人。今天的作业因为没有绘本,就说说阅读的事儿。从孩子0岁起,就要培养阅...
    罗靖方阅读 570评论 0 4