SQL 經典問題:列轉行

情景分析: html

如上文 經典SQL問題: 行轉列所示情節,反過來。
數據庫數據爲:
grade_result sql

處理後效果(id能夠不要):
grade_table 數據庫

方法一: spa

SELECT*FROM(
SELECTname,'語文'ascourse, 語文asscoreFROMgrade2
unionall
SELECTname,'數學'ascourse, 數學asscoreFROMgrade2
unionall
SELECTname,'英語'ascourse, 英語asscoreFROMgrade2
) tmpTable

這裏別名不要忘了寫:tmpTable。 調試

方法二: code

涉及知識點:能夠經過查詢表:INFORMATION_SCHEMA.COLUMNS 獲取數據庫表中的各個字段。能夠經過執行以下語句進行觀察 htm

SELECT*FROMINFORMATION_SCHEMA.COLUMNS;

咱們須要獲取除name字段之外的全部字段SQL以下: ci

SELECTCOLUMN_NAMEFROMINFORMATION_SCHEMA.COLUMNSWHERETABLE_SCHEMA ='test'ANDTABLE_NAME='grade2'ANDCOLUMN_NAME <>'name';

這裏的數據庫名稱爲test,根據實際狀況精心替換。 字符串

DELIMITER &&
CREATEPROCEDUREsp_trans()
BEGIN
#課程名稱
DECLAREcourse_nVARCHAR(20);
#全部課程數量
DECLAREcountINT;
#計數器
DECLAREiINTDEFAULT0;
#拼接SQL字符串
SET@s ='SELECT * FROM (';
SETcount= (SELECTCOUNT(*)FROMINFORMATION_SCHEMA.COLUMNSWHERETABLE_SCHEMA ='jd'ANDTABLE_NAME='grade2'ANDCOLUMN_NAME <>'name');
WHILE i <countDO
SETcourse_n = (SELECTCOLUMN_NAMEFROMINFORMATION_SCHEMA.COLUMNSWHERETABLE_SCHEMA ='jd'ANDTABLE_NAME='grade2'ANDCOLUMN_NAME <>'name'LIMIT i,1);
SET@s = CONCAT(@s ,' SELECT name, "');
SET@s = CONCAT(@s , course_n);
SET@s = CONCAT(@s,'", ');
SET@s = CONCAT(@s, course_n);
SET@s = CONCAT(@s,' as score FROM grade2 ');
IF i <>count-1THEN
SET@s = CONCAT(@s,'union all');
ENDIF;
SETi = i+1;
ENDWHILE;
SET@s = CONCAT(@s,' ) tepTable');
#用於調試
#SELECT@s;
PREPAREstmtFROM@s;
EXECUTEstmt;
END

方法分析: get

方法一使用了手動列舉列,產生數據後,union數據。
方法二使用存儲過程,從MySQL schem獲取表最新表字段,拼接SQL。其實是方法一的動態擴展。

Note:

能夠從前文:經典SQL問題: 行轉列的檢索結果直接建立新表,省去了本身建表填表的麻煩:

CREATETABLEgrade2
SELECTname,
SUM(CASEcourseWHEN'語文'THENscoreEND)AS'語文',
SUM(CASEcourseWHEN'數學'THENscoreEND)AS'數學',
SUM(CASEcourseWHEN'英語'THENscoreEND)AS'英語'
FROMgradeGROUPBYname
相關文章
相關標籤/搜索