- 情况一,如何行转列
建表语句:
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
tb
GROUP 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
tb2
UNION ALL
SELECT
姓名,
'数学' AS 课程,
数学 AS 分数
FROM
tb2
UNION ALL
SELECT
姓名,
'物理' AS 课程,
物理 AS 分数
FROM
tb2
总结:以上在实际开发应用中使用不是很好,在这只是做个记录,个人觉得实际开发中在业务中实现行列转换。