情景分析: 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 |