-- 列转行动态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 列转行 动态写法的更多相关文章

  1. Mysql 列转行group_concat函数,与行转列

    1.正常情况. SELECT JoinEventIds from nt_mainnum 2.使用group_concat函数 select group_concat(JoinEventIds) fro ...

  2. Mysql 列转行统计查询 、行转列统计查询

      -- ---------------------------- -- Table structure for `TabName` -- ---------------------------- D ...

  3. mysql 列转行,合并字段

    数据表: 列转行:利用max(case when then) max---聚合函数 取最大值 (case course when '语文' then score else 0 end) ---判断   ...

  4. mysql 列转行

    第一种方法:使用序列化表的方法实现列转行 第一种方法:使用UNION的方法实现列转行 第二种方法:使用序列化表的方法实现列转行

  5. mysql 列转行,合并字段的方法

    数据表(表名:xsk) +----+------+-----------+-------+ | id | name| course | score | +----+------+----------- ...

  6. mysql列转行 行转列

    列转行 SELECT flag ,substring_index(substring_index(t.context,), ) as result FROM ( select 'aa' as flag ...

  7. ( 转 ) Mysql group_concat 的反向应用实现(Mysql列转行)

    用过Mysql的都知道她有一个很好的实现行转列功能的函数group_concat函数,非常方便 点击(此处)折叠或打开 SELECT * FROM group_test; SELECT id, GRO ...

  8. mysql 列转行处理

    CREATE TABLE `table1` ( `id` ) DEFAULT NULL, `name` ) CHARACTER SET utf8 DEFAULT NULL ) ENGINE=MyISA ...

  9. mysql列转行

    要得到 SELECT name, SUM(CASE course WHEN '语文' THEN score END ) AS '语文', SUM(CASE course WHEN '数学' THEN ...

随机推荐

  1. custom-ubuntu-server-iso

    Remastering the Ubuntu Desktop ISO is easy considering the existing graphical tools but did you ever ...

  2. 理解 ASP.NET Core: 验证

    ASP.NET Core 验证 通常在应用程序中,安全分为前后两个步骤:验证和授权.验证负责检查当前请求者的身份,而授权则根据上一步得到的身份决定当前请求者是否能够访问期望的资源. 既然安全从验证开始 ...

  3. [LeetCode题解]143. 重排链表 | 快慢指针 + 反转

    解题思路 找到右边链表,再反转右边链表,然后按左.右逐一合并 代码 /** * Definition for singly-linked list. * public class ListNode { ...

  4. (msf使用)msfconsole - meterpreter

    [msf] msfconsole meterpreter 对于这款强大渗透测试框架,详情介绍可看这里:metasploit 使用教程 对于msfconsole, Kali Linux 自带.只需用命令 ...

  5. 历时两年零三个月,从刚毕业的外包到现在的阿里P7offer,我只做了这几件事

    前言 最近,金九银十在即,很多人都在准备面试,特别给大家总结了 Java 程序员面试必备题,这份面试清单是我从 去年开始收集的,一方面是给公司招聘用,另一方面是想用它来挖掘我在 Java 技术栈中的技 ...

  6. guitar pro 系列教程(十一):Guitar Pro菜单工具之MIDI效果的提升

    对于新手的一些朋友,看谱,编曲时使用Guitar Pro时,因为对其功能不是很了解而显得困难重重,导致出现的音频效果不是很理想,因此,小编今天要做的便是,单独把Guitar Pro里的MIDI效果如果 ...

  7. Java中类加载的过程

    类加载过程 这里的加载过程是严格按照加载开始顺序进行的,注意是加载开始而不是加载完成.也就是有可能会有两个或几个阶段是同时进行的. 比如下面提到的验证过程中的符号引用验证是在解析阶段开始之后进行. 加 ...

  8. vulnhub: DC 2

    首先地址探测找到主机IP: root@kali:~# nmap -sn 192.168.74.139/24 Starting Nmap 7.80 ( https://nmap.org ) at 202 ...

  9. idea中安装阿里巴巴的代码规范插件

    1.打开iead软件,从左上角点击File  ->  Settings  ->  Plugins 2.安装完成后,重启idea软件,即可正常使用了.

  10. 基础知识redis详解--【Foam番茄】

    Redis 学习方式: 上手就用 基本的理论先学习,然后将知识融汇贯通 nosql讲解 为什么要用Nosql 现在都是大数据时代 大数据一般的数据库无法进行分析处理了 至少要会Springboot+S ...