0
点赞
收藏
分享

微信扫一扫

mysql行转列

利用SUM(IF()) 生成列 + UNION 生成汇总行,并利用 IFNULL将汇总行标题显示为 Total

1

2

3

4

5

6

7

8

9

10

11

12

13

14


SELECT userid,

SUM(IF(`subject`='语文',score,0)) AS 语文,

SUM(IF(`subject`='数学',score,0)) AS 数学,

SUM(IF(`subject`='英语',score,0)) AS 英语,

SUM(IF(`subject`='政治',score,0)) AS 政治,

SUM(score) AS TOTAL

FROM tb_score

GROUP BY userid

UNION

SELECT 'TOTAL',SUM(IF(`subject`='语文',score,0)) AS 语文,

SUM(IF(`subject`='数学',score,0)) AS 数学,

SUM(IF(`subject`='英语',score,0)) AS 英语,

SUM(IF(`subject`='政治',score,0)) AS 政治,

SUM(score) FROM tb_score


运行结果:

mysql行转列_字符串


5、利用SUM(IF()) 生成列,直接生成结果不再利用子查询

1

2

3

4

5

6

7

8


SELECT IFNULL(userid,'TOTAL') AS userid,

SUM(IF(`subject`='语文',score,0)) AS 语文,

SUM(IF(`subject`='数学',score,0)) AS 数学,

SUM(IF(`subject`='英语',score,0)) AS 英语,

SUM(IF(`subject`='政治',score,0)) AS 政治,

SUM(score) AS TOTAL

FROM tb_score

GROUP BY userid WITH ROLLUP;


运行结果:

mysql行转列_函数返回_02


6、动态,适用于列不确定情况

1

2

3

4

5

6

7

8

9


SET @EE='';

select @EE :=CONCAT(@EE,'sum(if(subject= \'',subject,'\',score,0)) as ',subject, ',') AS aa FROM (SELECT DISTINCT subject FROM tb_score) A ;

 

SET @QQ = CONCAT('select ifnull(userid,\'TOTAL\')as userid,',@EE,' sum(score) as TOTAL from tb_score group by userid WITH ROLLUP');

-- SELECT @QQ;

 

PREPARE stmt FROM @QQ;

EXECUTE stmt;

DEALLOCATE PREPARE stmt;


运行结果:

mysql行转列_函数返回_03

mysql行转列_函数返回_04


7、合并字段显示:利用group_concat()

1

2


SELECT userid,GROUP_CONCAT(`subject`,":",score)AS 成绩 FROM tb_score

GROUP BY userid


运行结果:

mysql行转列_函数返回_05

group_concat(),手册上说明:该函数返回带有来自一个组的连接的非NULL值的字符串结果。

比较抽象,难以理解。通俗点理解,其实是这样的:group_concat()会计算哪些行属于同一组,将属于同一组的列显示出来。要返回哪些列,由函数参数(就是字段名)决定。分组必须有个标准,就是根据group by指定的列进行分组。

结论:group_concat()函数可以很好的建属于同一分组的多个行转化为一个列。

举报

相关推荐

0 条评论