# 横表CREATETABLE`table_h2z`(`name`varchar(32)DEFAULTNULL,`chinese`int(11)DEFAULTNULL,`math`int(11)DEFAULTNULL,`english`int(11)DEFAULTNULL)ENGINE=InnoDBAUTO_INCREMENT=4DEFAULTCHARSET=utf8;/*Data for the table `table_h2z` */insertinto`table_h2z`(`name`,`chinese`,`math`,`english`)values('mike',45,43,87),('lily',53,64,88),('lucy',57,75,75);# 纵表CREATETABLE`table_z2h`(`name`varchar(32)DEFAULTNULL,`subject`varchar(8)NOTNULLDEFAULT'',`score`int(11)DEFAULTNULL)ENGINE=InnoDBDEFAULTCHARSET=utf8;/*Data for the table `table_z2h` */insertinto`table_z2h`(`name`,`subject`,`score`)values('mike','chinese',45),('lily','chinese',53),('lucy','chinese',57),('mike','math',43),('lily','math',64),('lucy','math',75),('mike','english',87),('lily','english',88),('lucy','english',75);
横表转纵表
SELECT NAME,'chinese'AS`subject`, chinese AS`score`FROM table_h2z
UNIONALLSELECT NAME,'math'AS`subject`, math AS`score`FROM table_h2z
UNIONALLSELECT NAME,'english'AS`subject`, english AS`score`FROM table_h2z
执行结果:
+------+---------+-------+| name | subject | score |+------+---------+-------+| mike | chinese |45|| lily | chinese |53|| lucy | chinese |57|| mike | math |43|| lily | math |64|| lucy | math |75|| mike | english |87|| lily | english |88|| lucy | english |75|+------+---------+-------+
纵表转横表
SELECT NAME,SUM(CASE`subject`WHEN'chinese'THEN score ELSE0END)AS chinese,SUM(CASE`subject`WHEN'math'THEN score ELSE0END)AS math,SUM(CASE`subject`WHEN'english'THEN score ELSE0END)AS english
FROM table_z2h
GROUPBY NAME
执行结果:
+------+---------+------+---------+| name | chinese | math | english |+------+---------+------+---------+| lily |53|64|88|| lucy |57|75|75|| mike |45|43|87|+------+---------+------+---------+