mysql 列转行 动态写法
-- 列转行动态sql
-- 测试表
DROP TABLE IF EXISTS `tb_score`;
CREATE TABLE `tb_score` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`userid` varchar(20) NOT NULL COMMENT '用户id',
`subject` varchar(20) DEFAULT NULL COMMENT '科目',
`score` double DEFAULT NULL COMMENT '成绩',
PRIMARY KEY (`id`)
);
INSERT INTO `tb_score` VALUES ('1', '001', '语文', '90');
INSERT INTO `tb_score` VALUES ('2', '001', '数学', '92');
INSERT INTO `tb_score` VALUES ('3', '001', '英语', '80');
INSERT INTO `tb_score` VALUES ('4', '002', '语文', '88');
INSERT INTO `tb_score` VALUES ('5', '002', '数学', '90');
INSERT INTO `tb_score` VALUES ('6', '002', '英语', '75.5');
INSERT INTO `tb_score` VALUES ('7', '003', '语文', '70');
INSERT INTO `tb_score` VALUES ('8', '003', '数学', '85');
INSERT INTO `tb_score` VALUES ('9', '003', '英语', '90');
INSERT INTO `tb_score` VALUES ('10', '003', '政治', '82');
-- 查询结果
Select * from tb_score;

我们想要的结果---------

可以使用以下sql
select b.userid,
sum(case `subject` when '语文' then score else 0 end) '语文',
sum(case `subject` when '数学' then score else 0 end) '数学',
sum(case `subject` when '英语' then score else 0 end) '英语',
sum(case `subject` when '政治' then score else 0 end) '政治'
from tb_score b GROUP BY userid;
以上代码 的缺点是 需要明确知道科目 的种类,且科目过多 sql 会越来越长,主要是 sum(case `subject` when '语文' then score else 0 end) '语文', 这一段 需要拼接,改为动态拼接
先拼接这一段
-- 1、申明@sql
set @sql=null;
-- 2、拼接
select GROUP_CONCAT(DISTINCT CONCAT('sum(case subject',' when ''',subject,''' then score else 0 end) as ''',subject,'''')) into @sql from tb_score;
-- 3、查看拼接结果
select @sql;

动态拼接 不管 subject 有多少 sql 语句不会增加....
继续拼接成 以下 得到我们需要的结果

拼接语句
set @sql =CONCAT('select b.userid,',@sql,'from tb_score b GROUP BY userid');
-- 查看拼接结果
select @sql

最终得到sql

此时得到sql 并不能直接运行 需要使用 PREPARE 执行
-- 使用预执行 PREPARE 声明 stmt
PREPARE stmt FROM @sql;
-- 开始执行
EXECUTE stmt;
-- 清除
DEALLOCATE PREPARE stmt;
完整代码
set @sql=null;
-- 拼接
select GROUP_CONCAT(DISTINCT CONCAT('sum(case subject',' when ''',subject,''' then score else 0 end) as ''',subject,'''')) into @sql from tb_score;
-- 查看拼接结果
select @sql; set @sql =CONCAT('select b.userid,',@sql,'from tb_score b GROUP BY userid');
SELECT @sql; -- 使用预执行 PREPARE 声明 stmt
PREPARE stmt FROM @sql;
-- 开始执行
EXECUTE stmt;
-- 清除
DEALLOCATE PREPARE stmt;
mysql 列转行 动态写法的更多相关文章
- Mysql 列转行group_concat函数,与行转列
1.正常情况. SELECT JoinEventIds from nt_mainnum 2.使用group_concat函数 select group_concat(JoinEventIds) fro ...
- Mysql 列转行统计查询 、行转列统计查询
-- ---------------------------- -- Table structure for `TabName` -- ---------------------------- D ...
- mysql 列转行,合并字段
数据表: 列转行:利用max(case when then) max---聚合函数 取最大值 (case course when '语文' then score else 0 end) ---判断 ...
- mysql 列转行
第一种方法:使用序列化表的方法实现列转行 第一种方法:使用UNION的方法实现列转行 第二种方法:使用序列化表的方法实现列转行
- mysql 列转行,合并字段的方法
数据表(表名:xsk) +----+------+-----------+-------+ | id | name| course | score | +----+------+----------- ...
- mysql列转行 行转列
列转行 SELECT flag ,substring_index(substring_index(t.context,), ) as result FROM ( select 'aa' as flag ...
- ( 转 ) Mysql group_concat 的反向应用实现(Mysql列转行)
用过Mysql的都知道她有一个很好的实现行转列功能的函数group_concat函数,非常方便 点击(此处)折叠或打开 SELECT * FROM group_test; SELECT id, GRO ...
- mysql 列转行处理
CREATE TABLE `table1` ( `id` ) DEFAULT NULL, `name` ) CHARACTER SET utf8 DEFAULT NULL ) ENGINE=MyISA ...
- mysql列转行
要得到 SELECT name, SUM(CASE course WHEN '语文' THEN score END ) AS '语文', SUM(CASE course WHEN '数学' THEN ...
随机推荐
- 基于FFmpeg的Dxva2硬解码及Direct3D显示(二)
解析视频源 目录 解析视频源 获取视频流 解析视频流 说明:这篇博文分为"获取视频流"和"解析视频流"两个部分,使用的是FFmpeg4.1的版本,与网上流传的低 ...
- 【webSokect】基于django Channels的简单实现
# settings.py: INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.con ...
- 部署Dotnet Core应用到Kubernetes(二)
前一篇文章,概念性地介绍了K8s的一些基础组件,如Pod.部署和服务.这篇文章,我打算写写如何使用YAML清单定义和配置这些资源. 实际上,在K8s集群中创建对象有几种方式 - 命令,或声明.两种 ...
- vdbench测试实时可视化显示
前言 前一段时间碰到一个系统,用rados bench 去跑都还比较正常,但是一跑数据库就非常慢,测试工具会抛出延时过大的提示,经过排查发现,云平台中有一台虚拟机还运行着备份数据库的服务,而这个备份软 ...
- Ceph的参数mon_osd_down_out_subtree_limit细解
前言 之前跟一个朋友沟通一个其他的问题的时候,发现了有一个参数 mon osd down out subtree limit 一直没有接触到,看了一下这个参数还是很有作用的,本篇将讲述这个参数的作用和 ...
- JUC锁种类总结
在并发编程中有各种各样的锁,有的锁对象一个就身兼多种锁身份,所以初学者常常对这些锁造成混淆,所以这里来总结一下这些锁的特点和实现. 乐观锁.悲观锁 悲观锁 悲观锁是最常见的锁,我们常说的加锁指的也就是 ...
- 使用Java将XSL和XML文件输出为HTML(XSL学习笔记二)
XSL 指扩展样式表语言(EXtensible Stylesheet Language),前面一篇博客介绍了使用XSL即可直接将XML输出为HTML片段被浏览器解析,但是这样在web应用中浏览器的解析 ...
- MySQL索引背后的数据结构及原理
摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...
- Linux提权(持续更新)
利用/etc/passwd提权 个人认为,这种提权方式在现实场景中难以实现,条件太过苛刻,但是建立Linux下的隐藏账户是个不错的选择,灵感来自:https://www.hackingarticles ...
- 新鲜出炉,这是全网讲的最详细的springboot整合消息服务了吧,建议收藏!
springboot整合activeMq ActiveMq是Apache提供的开源消息系统采用java实现, 很好地支持JMS(Java Message Service,即Java消息服务) 规范 A ...