SQL行轉列與列轉行(轉)


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

add by zhj: 本文是以MySQL為例說明的,但其實它適用於所有關系型數據庫。

行轉列的需求如下,可以發現,行轉列時其實是先group by,然后將每個組中的行轉為列,使用case-when + 聚合函數,

每個由行轉為列的列,都要使用case-when或when-case語句。case-when是怎么作用的呢?組中的每行都經過case-when,

如果組中有N行,那通過case-when就產生N個值,再使用聚合函數,變為一個單一值,即新列的值。

行轉列

例如:把圖1轉換成圖2結果展示

圖1 

 

圖2

 

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:

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結果展示

圖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;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM