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分組的。
發佈了43 篇原創文章 · 獲贊 27 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章