SQL實現 列轉行(MySQL中)


CREATE TABLE `grade` (

  `studyCode` varchar(20) NOT NULL DEFAULT '' COMMENT '學號',

  `subjectS` varchar(20) NOT NULL,

  `score` int(20) NOT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `grade` VALUES ('001', '數學', '120');

INSERT INTO `grade` VALUES ('002', '數學', '130');

INSERT INTO `grade` VALUES ('003', '數學', '125');

INSERT INTO `grade` VALUES ('001', '英語', '130');

INSERT INTO `grade` VALUES ('002', '英語', '140');

INSERT INTO `grade` VALUES ('003', '英語', '135');

INSERT INTO `grade` VALUES ('001', '國學', '110');

INSERT INTO `grade` VALUES ('002', '國學', '136');

INSERT INTO `grade` VALUES ('003', '國學', '145');

SET FOREIGN_KEY_CHECKS=1;

一,純 列轉行

(1)SELECT  *  FROM `grade` ;

 

 

2SELECT  

studyCode 學號,

SUM(IF(subjectS = '國學',score,0)) 國學,

SUM(IF(subjectS = '數學',score,0)) 數學,

SUM(IF(subjectS = '英語',score,0)) 英語

   FROM grade

GROUP BY studyCode;

 

 

 

*使用CASE WHEN THEN ELSE END也可以

SELECT  

studyCode 學號,

SUM(CASE WHEN subjectS = '國學' THEN  score ELSE 0 END) 國學,

SUM(CASE WHEN subjectS = '數學' THEN  score ELSE 0 END) 數學,

SUM(CASE WHEN subjectS = '英語' THEN  score ELSE 0 END) 英語

   FROM grade

GROUP BY studyCode;

 

 

二,帶統計的列轉行(3種方式,A,B,C)

A步驟:(1SELECT

studyCode,subjectS,score FROM `grade`

GROUP BY studyCode,subjectS WITH ROLLUP ;

 

 

 

2

SELECT

studyCode,subjectS,SUM(score) FROM `grade`

GROUP BY studyCode,subjectS WITH ROLLUP ;

 

 

 

3SELECT studyCode,IFNULL(subjectS,'total'),SUM(score) FROM `grade` GROUP BY studyCode,subjectS WITH ROLLUP ;

 

作為子查詢

 

 

 

 

 

4SELECT  

IFNULL(xh,'total') 學號,

SUM(IF(km like '%國學%',fs,0)) 國學,

SUM(IF(km like '%數學%',fs,0)) 數學,

SUM(IF(km like '%英語%',fs,0)) 英語,

SUM(IF(km like 'total',fs,0)) total

  from(

SELECT studyCode xh,IFNULL(subjectS,'total') km,SUM(score) fs FROM `grade` GROUP BY studyCode,subjectS WITH ROLLUP

HAVING studyCode IS NOT NULL

) A

GROUP BY xh with ROLLUP;

 

 

 

*存在數據庫中的數據有時有空格,所以此處我用了like %% 模糊查詢

 

SELECT  

IFNULL(xh,'total') 學號,

SUM(IF(km = '國學',fs,0)) 國學,

SUM(IF(km = '數學',fs,0)) 數學,

SUM(IF(km = '英語',fs,0)) 英語,

SUM(IF(km = 'total',fs,0)) total

  from(

SELECT studyCode xh,IFNULL(subjectS,'total') km,SUM(score) fs FROM `grade` GROUP BY studyCode,subjectS WITH ROLLUP

HAVING studyCode IS NOT NULL

) A

GROUP BY xh with ROLLUP;

 

數據沒有空格,這樣用。

 

 

 

B方案--利用SUM(IF()) 生成列,直接生成結果  (最簡潔

select

ifnull(studyCode,'total')  '--',

SUM(IF(subjectS = '國學',score,0)) 國學,

SUM(IF(subjectS = '數學',score,0)) 數學,

SUM(IF(subjectS = '英語',score,0)) 英語,

SUM(score) AS TOTAL

from grade

group by studyCode with rollup ;

 

 

 

C方案--SUM(IF()) 生成列 + UNION 生成匯總行,並利用 IFNULL將匯總行標題顯示為 Total

 

select studyCode,

SUM(IF(subjectS = '國學',score,0)) 國學,

SUM(IF(subjectS = '數學',score,0)) 數學,

SUM(IF(subjectS = '英語',score,0)) 英語,

SUM(score) AS TOTAL

from grade

group by studyCode

UNION

SELECT 'TOTAL',

SUM(IF(subjectS = '國學',score,0)) 國學,

SUM(IF(subjectS = '數學',score,0)) 數學,

SUM(IF(subjectS = '英語',score,0)) 英語,

SUM(score) AS TOTAL

FROM grade;


免責聲明!

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



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