SQL面试题之行列转换

来源:互联网 发布:2017新开放域名后缀 编辑:程序博客网 时间:2024/05/23 11:33
  • 情况一,如何行转列

建表语句:

SET FOREIGN_KEY_CHECKS=0;-- ------------------------------ Table structure for tb-- ----------------------------DROP TABLE IF EXISTS `tb`;CREATE TABLE `tb` (  `姓名` varchar(10) DEFAULT NULL,  `课程` varchar(10) DEFAULT NULL,  `分数` int(11) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- ------------------------------ Records of tb-- ----------------------------INSERT INTO `tb` VALUES ('李四', '物理', '22');INSERT INTO `tb` VALUES ('李四', '数学', '53');INSERT INTO `tb` VALUES ('张三', '物理', '35');INSERT INTO `tb` VALUES ('李四', '语文', '52');INSERT INTO `tb` VALUES ('张三', '语文', '52')

表结构如下:
这里写图片描述
实现如下效果:
这里写图片描述

查询语句如下:

SELECT    姓名,    max(        CASE        WHEN 课程 = '语文' THEN            分数        ELSE            0        END    ) 语文,    max(        CASE        WHEN 课程 = '数学' THEN            分数        ELSE            0        END    ) 数学,    max(        CASE        WHEN 课程 = '物理' THEN            分数        ELSE            0        END    ) 物理FROM    tbGROUP BY    姓名;
  • 情况一,如何列转行

建表语句:

DROP TABLE IF EXISTS `tb2`;CREATE TABLE `tb2` (  `姓名` varchar(10) DEFAULT NULL,  `语文` int(11) DEFAULT NULL,  `数学` int(11) DEFAULT NULL,  `物理` int(11) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- ------------------------------ Records of tb2-- ----------------------------INSERT INTO `tb2` VALUES ('张三', '21', '212', '111');INSERT INTO `tb2` VALUES ('李四', '2', '212', '2');

表结构如下:
表结构
实现如下效果:
这里写图片描述

查询语句:

SELECT    姓名,    '语文' AS 课程,    语文 AS 分数FROM    tb2UNION ALL    SELECT        姓名,        '数学' AS 课程,        数学 AS 分数    FROM        tb2    UNION ALL        SELECT            姓名,            '物理' AS 课程,            物理 AS 分数        FROM            tb2

总结:以上在实际开发应用中使用不是很好,在这只是做个记录,个人觉得实际开发中在业务中实现行列转换。

原创粉丝点击