mysql行转列,列转行

该文章使用数据库为mysql,客户端为navicate。   

 这个是我在面试中于到的一个问题,就是一张学生表,有姓名(name),年龄(age)两个字段,以姓名为数据第一行,年龄为数据第二行。

    

    左边图为所建的表,右边的图为查询结果。

    建表语句如下

create table user(
	name varchar(20),
	age int(10)
)
insert into user SELECT '甲',22;
insert into user select '乙',21;
insert into user SELECT '丙',29;
insert into user select '丁',25;

查询语句如下,

SELECT
      
      MAX(CASE name WHEN '甲' THEN age ELSE 0 END) AS '甲',
      MAX(CASE name WHEN '乙' THEN age ELSE 0 END) AS '乙',
      MAX(CASE name WHEN '丙' THEN age ELSE 0 END) AS '丙',
      MAX(CASE name WHEN '丁' THEN age ELSE 0 END) AS '丁'
FROM user

    MAX函数是用来将无数据的点设置为0,使用case when函数将查询出来的数据第一行设定为,甲乙丙丁,第二行设定为年龄字段。查询结果如右图。

    这个是简单的一对一,就是以一个字段为行,另外一个字段为列。若第一行有多个字段,就需要使用group by。

    比如说,创建姓名,学科,分数三个字段的表,以姓名学科为第一行。

    建表语句如下,

create table scores(
	username VARCHAR(20),
	`subject` VARCHAR(10),
	score int(10)
)
insert into scores values('tom','语文',66);
insert into scores values('tom','数学',66);
insert into scores values('tom','英语',66);
insert into scores values('tom','生物',66);
INSERT INTO Scores SELECT 'Nick', '语文', 80;
INSERT INTO Scores SELECT 'Nick', '数学', 90;
INSERT INTO Scores SELECT 'Nick', '英语', 70;
INSERT INTO Scores SELECT 'Nick', '生物', 85;
INSERT INTO Scores SELECT 'Kent', '语文', 80;
INSERT INTO Scores SELECT 'Kent', '数学', 90;
INSERT INTO Scores SELECT 'Kent', '英语', 70;
INSERT INTO Scores SELECT 'Kent', '生物', 85;

左图所建表,右图查询结果。


查询语句如下,

SELECT
      UserName 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 '英语',
      MAX(CASE Subject WHEN '生物' THEN Score ELSE 0 END) AS '生物'
FROM Scores
GROUP BY UserName
这个需要判断,你是用什么分组的,该表是用Username分组的。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值