情景分析: html
如上文 經典SQL問題: 行轉列所示情節,反過來。
數據庫數據爲:
sql
方法一: 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 |