SQL行轉列與列轉行(轉)

原文: http://blog.csdn.net/jx_870915876/article/details/52403472sql

add by zhj: 本文是以MySQL爲例說明的,但其實它適用於全部關係型數據庫。數據庫

行轉列的需求以下,能夠發現,行轉列時實際上是先group by,而後將每一個組中的行轉爲列,使用case-when + 聚合函數,函數

每一個由行轉爲列的列,都要使用case-when或when-case語句。case-when是怎麼做用的呢?組中的每行都通過case-when,spa

若是組中有N行,那經過case-when就產生N個值,再使用聚合函數,變爲一個單一值,即新列的值。.net

行轉列

例如:把圖1轉換成圖2結果展現3d

圖1 code

 

圖2blog

 

1
2
3
4
5
6
7
CREATE  TABLE  `TEST_TB_GRADE` (
   `ID`  int (10)  NOT  NULL  AUTO_INCREMENT,
   `USER_NAME`  varchar (20)  DEFAULT  NULL ,
   `COURSE`  varchar (20)  DEFAULT  NULL ,
   `SCORE`  float  DEFAULT  '0' ,
   PRIMARY  KEY  (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=1  DEFAULT  CHARSET=utf8;

 

1
2
3
4
5
6
7
8
9
10
insert  into  TEST_TB_GRADE(USER_NAME, COURSE, SCORE)   values
( "張三" "數學" , 34),
( "張三" "語文" , 58),
( "張三" "英語" , 58),
( "李四" "數學" , 45),
( "李四" "語文" , 87),
( "李四" "英語" , 45),
( "王五" "數學" , 76),
( "王五" "語文" , 34),
( "王五" "英語" , 89);

  

行轉列SQL:ci

1
2
3
4
5
6
SELECT  user_name ,
     MAX ( CASE  course  WHEN  '數學'  THEN  score  ELSE  END  ) 數學,
     MAX ( CASE  course  WHEN  '語文'  THEN  score  ELSE  END  ) 語文,
     MAX ( CASE  course  WHEN  '英語'  THEN  score  ELSE  END  ) 英語
FROM  test_tb_grade
GROUP  BY  USER_NAME;

  

列轉行

例如:把圖1轉換成圖3結果展現get

圖3

 

列轉行SQL:

1
2
3
4
select  user_name,  '語文'  COURSE , CN_SCORE  as  SCORE  from  test_tb_grade2
union  select  user_name,  '數學'  COURSE, MATH_SCORE  as  SCORE  from  test_tb_grade2
union  select  user_name,  '英語'  COURSE, EN_SCORE  as  SCORE  from  test_tb_grade2
order  by  user_name,COURSE;
相關文章
相關標籤/搜索