MySQL行专列----动态列

MySQL 行转列,参考自:

一篇文章搞定mysql的 行转列(7种方法) 和 列转行

本文主要针对动态列这一方法进行理解

定义变量@EE,并初始化为’’

SET @EE=‘’;
/**
将CONCAT()拼接后的SQL片段赋值给变量@EE。
拆解:

  1. := 对变量进行赋值
  2. concat() 拼接字符串函数
  3. sum() 求和函数
  4. IF(condition, value_if_true, value_if_false) 如果条件为 TRUE,IF() 函数返回一个值,如果条件为 FALSE,则返回另一个值。
  5. sum(if()) : 如果subject = subject, 则取对应的score, 否则取0进行求和,并取别名为subject字段对应的值
  6. (SELECT DISTINCT subject FROM tb_score) 确定需要查询的列字段
    */
    select @EE :=CONCAT(@EE, ‘sum(if(subject= ‘’,subject,’',score,0)) as ', subject, ‘,’) AS aa FROM (SELECT DISTINCT subject FROM tb_score) A ;
    select @EE;

定义变量@QQ,并初始化为’’

SET @QQ = ‘’;
/**
赋值@QQ, 拼接完整的SQL
拆解:
ifnull(): 如果表达式为NULL,则返回指定值,否则返回表达式, 即如果userid为null,则返回TOTAL,反之返回userid对应的值
‘select ifnull(userid, ‘TOTAL’ )as userid,’ : SQL 片段,
WITH ROLLUP:在group分组字段的基础上再进行统计数据,在最后记录后面新增一行,显示select查询时聚合函数的统计和计算结果
*/
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;

查询成绩表,使用sum(if())实现行转列,列名为userid、语文、数学、英语、政治、TOTAL,使用group by 按userid进行分组,此时行转列的一行数据将会按userid拆分为多行数据

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;

猜你喜欢

转载自blog.csdn.net/qq_37196265/article/details/131709077
今日推荐