侧边栏壁纸
博主头像
会飞的大象博主等级

爱运动的程序猿

  • 累计撰写 126 篇文章
  • 累计创建 158 个标签
  • 累计收到 0 条评论
标签搜索

目 录CONTENT

文章目录

mysql行转列与列转行

会飞的大象
2022-07-05 / 0 评论 / 0 点赞 / 595 阅读 / 318 字

创建表 user 并插入测试数据.

CREATE TABLE `user`  (
  `id` int(11) NOT NULL,
  `field_number` int(11) NULL DEFAULT NULL,
  `field_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `field_value` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `field_type` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `model_num` int(11) NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES (1, 1, 'name', '张三', 'string', 10001);
INSERT INTO `user` VALUES (2, 1, 'age', '18', 'int', 10001);
INSERT INTO `user` VALUES (3, 2, 'name', '李四', 'string', 10001);
INSERT INTO `user` VALUES (4, 2, 'age', '18', 'int', 10001);

原数据

select *  from user;

image

行转列

SELECT
	`field_number` as  用户编号,
	MAX( CASE WHEN field_name = 'age' THEN field_value END )  as 'age',
	MAX( CASE WHEN field_name = 'name' THEN field_value END ) as 'name'
FROM
	user 
GROUP BY
	`field_number`;

image-1657004460349

列转行

SELECT
field_number,
GROUP_CONCAT(CASE WHEN field_name = 'name' THEN field_value END SEPARATOR '') 'name',
GROUP_CONCAT(CASE WHEN field_name = 'age' THEN field_value END SEPARATOR '') 'age'
FROM user
GROUP BY field_number;

image-1657173755158

动态列实现参考

http://jintang.zone/2021/08/31/动态字段存储方案对比.html

0

评论区