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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL中,专列可以使用以下几种方法: 1. 使用PIVOT语句:PIVOT语句是一种行转列的SQL操作,它可以将数据转换为数据。但是,MySQL并不支持PIVOT语句,因此需要使用其他方法来实现行转列。 2. 使用GROUP BY和聚合函数:使用GROUP BY语句和聚合函数(如SUM、AVG、MAX、MIN等)可以将一组数据转换为单个数据,并将其中的数据转换为数据。例如,将一个销售表按照商品类型分组,并计算每个商品类型的销售总额,可以使用以下语句: SELECT type, SUM(sales) AS total_sales FROM sales_table GROUP BY type; 这将返回一个表格,其中每表示一个商品类型和它的销售总额。 3. 使用CASE语句:使用CASE语句可以将一个数据转换为多个数据。例如,将一个人员表格中的性别转换为男、女两个数据,可以使用以下语句: SELECT name, CASE WHEN gender = 'M' THEN 'Male' ELSE 'Female' END AS gender FROM person_table; 这将返回一个表格,其中每表示一个人员的姓名和性别。 4. 使用UNION语句:使用UNION语句可以将多个表格合并为一个表格,并将其中的数据转换为数据。例如,将一个销售表格中的商品名称、销售数量和销售额分别转换为单个数据,可以使用以下语句: SELECT product_name AS name, 'Quantity' AS type, quantity AS value FROM sales_table UNION ALL SELECT product_name AS name, 'Sales' AS type, sales AS value FROM sales_table; 这将返回一个表格,其中每表示一个商品名称、一个数据类型和一个数据值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值