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
相关文章
相关标签/搜索