该文章使用数据库为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分组的。