該文章使用數據庫爲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分組的。