1. 程式人生 > 其它 >Mysql:mysql行轉列(數值行和字元行)

Mysql:mysql行轉列(數值行和字元行)

數值行轉列

建表

DROP TABLE IF EXISTS tb_score;

CREATE TABLE tb_score(
    id INT(11) NOT NULL auto_increment,
    userid VARCHAR(20) NOT NULL COMMENT '使用者id',
    subject VARCHAR(20) COMMENT '科目',
    score DOUBLE COMMENT '成績',
    PRIMARY KEY(id)
)ENGINE = INNODB DEFAULT CHARSET = utf8;

新增資料

INSERT INTO tb_score(userid,subject,score) VALUES ('001','語文',90);
INSERT INTO tb_score(userid,subject,score) VALUES ('001','數學',92);
INSERT INTO tb_score(userid,subject,score) VALUES ('001','英語',80);
INSERT INTO tb_score(userid,subject,score) VALUES ('002','語文',88);
INSERT INTO tb_score(userid,subject,score) VALUES ('002','數學',90);
INSERT INTO tb_score(userid,subject,score) VALUES ('002','英語',75.5);
INSERT INTO tb_score(userid,subject,score) VALUES ('003','語文',70);
INSERT INTO tb_score(userid,subject,score) VALUES ('003','數學',85);
INSERT INTO tb_score(userid,subject,score) VALUES ('003','英語',90);
INSERT INTO tb_score(userid,subject,score) VALUES ('003','政治',82);

轉換

select  
userid,
sum(case when subject='語文' then score else 0 end) as `語文`,
sum(case when subject='數學' then score else 0 end) as `數學`,
sum(case when subject='英語' then score else 0 end) as `英語`,
sum(case when subject='政治' then score else 0 end) as `政治`
from tb_score 
group by userid

字元行轉列

建表

CREATE TABLE `tb_basics` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL COMMENT '使用者名稱',
  `skillType` varchar(20) DEFAULT NULL COMMENT '技能型別',
  `skillName` varchar(20) DEFAULT NULL COMMENT '技能',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;

新增資料

INSERT INTO `tb_basics`(`id`, `name`, `skillType`, `skillName`) VALUES (1, '張三', '平A', '大逼兜');
INSERT INTO `tb_basics`(`id`, `name`, `skillType`, `skillName`) VALUES (2, '張三', '小絕', '退退退!');
INSERT INTO `tb_basics`(`id`, `name`, `skillType`, `skillName`) VALUES (3, '張三', '大招', '閃電五連鞭');
INSERT INTO `tb_basics`(`id`, `name`, `skillType`, `skillName`) VALUES (4, '李四', '平A', '掃堂腿');
INSERT INTO `tb_basics`(`id`, `name`, `skillType`, `skillName`) VALUES (5, '李四', '小絕', '洪家鐵線拳');
INSERT INTO `tb_basics`(`id`, `name`, `skillType`, `skillName`) VALUES (6, '李四', '大招', '齊眉棍');
INSERT INTO `tb_basics`(`id`, `name`, `skillType`, `skillName`) VALUES (7, '王五', '平A', '縮骨功');
INSERT INTO `tb_basics`(`id`, `name`, `skillType`, `skillName`) VALUES (8, '王五', '小絕', '八卦掌');
INSERT INTO `tb_basics`(`id`, `name`, `skillType`, `skillName`) VALUES (9, '王五', '大招', '玄冥神掌');

轉換

select  
name,
GROUP_CONCAT(case when skillType='平A' then skillName end Separator ',') as `平A`,
GROUP_CONCAT(case when skillType='小絕' then skillName end Separator ',') as `小絕`,
GROUP_CONCAT(case when skillType='大招' then skillName end Separator ',') as `大招`
from tb_basics 
group by name