精华内容
下载资源
问答
  • mysql行转列、列转行  语句不难,不做多余解释了,看语句时,从内往外一句一句剖析 行转列  有如图所示的表,现在希望查询的结果将行转成列  建表语句如下: CREATE TABLE `TEST_TB_GRADE` ( `ID` int(10) NOT...
  • Mysql 行转列,列转行 SQL语句和示例表结构SQL Mysql 行转列,列转行 SQL语句和示例表结构SQL
  • mysql行转列(将同一列下的不同内容的几行数据,转换成几列显示)、列转行、行列汇总、合并显示
  • PAGE / NUMPAGES 转行 主要讨论sys_connect_by_path的使用方法 1带层次关系 SQL> create table dept(deptno number,deptname varchar2(20,mgrno number;文档收集自网络仅用于个人学习 Table created. SQL> insert ...
  • mysql动态行转列

    2016-11-04 14:13:22
    mysql动态行转列的例子
  • MySQL行转列函数

    千次阅读 2019-11-04 09:07:51
    原文链接: ...概述 好久没写SQL语句,今天看到问答中的一个问题,拿来...学校里面记录成绩,每个人的选课不一样,而且以后会添加课程,所以不需要把所有课程当作。数据表里面数据如下图,使用姓名+课程作为联合主键(...

    原文链接:
    http://www.360doc.com/content/18/0525/20/14808334_757019563.shtml
    概述
    好久没写SQL语句,今天看到问答中的一个问题,拿来研究一下。

    问题链接:关于Mysql 的分级输出问题

    情景简介
    学校里面记录成绩,每个人的选课不一样,而且以后会添加课程,所以不需要把所有课程当作列。数据表里面数据如下图,使用姓名+课程作为联合主键(有些需求可能不需要联合主键)。本文以MySQL为基础,其他数据库会有些许语法不同。

    数据库表数据:
    在这里插入图片描述

    处理后的结果(行转列):
    在这里插入图片描述
    在这里插入图片描述
    方法一:

    这里可以使用Max,也可以使用Sum;

    注意第二张图,当有学生的某科成绩缺失的时候,输出结果为Null;

    SELECT  
        SNAME,  
        MAX(  
            CASE CNAME  
            WHEN 'JAVA' THEN  
                SCORE  
            END  
        ) JAVA,  
        MAX(  
            CASE CNAME  
            WHEN 'mysql' THEN  
                SCORE  
            END  
        ) mysql  
    FROM  
        stdscore  
    GROUP BY  
        SNAME;  
    

    可以在第一个Case中加入Else语句解决这个问题:

    SELECT  
        SNAME,  
        MAX(  
            CASE CNAME  
            WHEN 'JAVA' THEN  
                SCORE  
            ELSE  
                0  
            END  
        ) JAVA,  
        MAX(  
            CASE CNAME  
            WHEN 'mysql' THEN  
                SCORE  
            ELSE  
                0  
            END  
        ) mysql  
    FROM  
        stdscore  
    GROUP BY  
        SNAME;  
    

    方法二:

    SELECT DISTINCT  a.sname,  
    (SELECT score FROM stdscore b WHERE a.sname=b.sname AND b.CNAME='JAVA' ) AS 'JAVA',  
    (SELECT score FROM stdscore b WHERE a.sname=b.sname AND b.CNAME='mysql' ) AS 'mysql'  
    FROM stdscore a  
    

    方法三:

    DROP PROCEDURE  
    IF EXISTS sp_score;  
    DELIMITER &&  
      
    CREATE PROCEDURE sp_score ()  
    BEGIN  
        #课程名称  
        DECLARE  
            cname_n VARCHAR (20) ; #所有课程数量  
            DECLARE  
                count INT ; #计数器  
                DECLARE  
                    i INT DEFAULT 0 ; #拼接SQL字符串  
                SET @s = 'SELECT sname' ;  
                SET count = (  
                    SELECT  
                        COUNT(DISTINCT cname)  
                    FROM  
                        stdscore  
                ) ;  
                WHILE i < count DO  
      
      
                SET cname_n = (  
                    SELECT  
                        cname  
                    FROM  
                        stdscore  
                    GROUP BY CNAME   
                    LIMIT i,  
                    1  
                ) ;  
                SET @s = CONCAT(  
                    @s,  
                    ', SUM(CASE cname WHEN ',  
                    '\'',  
                    cname_n,  
                    '\'',  
                    ' THEN score ELSE 0 END)',  
                    ' AS ',  
                    '\'',  
                    cname_n,  
                    '\''  
                ) ;  
                SET i = i + 1 ;  
                END  
                WHILE ;  
                SET @s = CONCAT(  
                    @s,  
                    ' FROM stdscore GROUP BY sname'  
                ) ; #用于调试  
                #SELECT @s;  
                PREPARE stmt  
                FROM  
                    @s ; EXECUTE stmt ;  
                END&&  
      
    CALL sp_score () ;  
    

    处理后的结果(行转列)分级输出:
    在这里插入图片描述
    在这里插入图片描述
    方法一:
    这里可以使用Max,也可以使用Sum;

    注意第二张图,当有学生的某科成绩缺失的时候,输出结果为Null;

    SELECT  
        SNAME,  
        MAX(  
            CASE CNAME  
            WHEN 'JAVA' THEN  
                (  
                    CASE  
                    WHEN SCORE - (select avg(SCORE) from stdscore where CNAME='JAVA') > 20 THEN  
                        '优秀'  
                    WHEN SCORE - (select avg(SCORE) from stdscore where CNAME='JAVA') > 10 THEN  
                        '良好'  
                    WHEN SCORE - (select avg(SCORE) from stdscore where CNAME='JAVA') >= 0 THEN  
                        '普通'  
                    ELSE  
                        '较差'  
                    END  
                )  
            END  
        ) JAVA,  
        MAX(  
            CASE CNAME  
            WHEN 'mysql' THEN  
                (  
                    CASE  
                    WHEN SCORE - (select avg(SCORE) from stdscore where CNAME='JAVA') > 20 THEN  
                        '优秀'  
                    WHEN SCORE - (select avg(SCORE) from stdscore where CNAME='JAVA') > 10 THEN  
                        '良好'  
                    WHEN SCORE - (select avg(SCORE) from stdscore where CNAME='JAVA') >= 0 THEN  
                        '普通'  
                    ELSE  
                        '较差'  
                    END  
                )  
            END  
        ) mysql  
    FROM  
        stdscore  
    GROUP BY  
        SNAME;  
    

    方法二:

    SELECT DISTINCT  a.sname,  
    (SELECT (  
                    CASE  
                    WHEN SCORE - (select avg(SCORE) from stdscore where CNAME='JAVA') > 20 THEN  
                        '优秀'  
                    WHEN SCORE - (select avg(SCORE) from stdscore where CNAME='JAVA') > 10 THEN  
                        '良好'  
                    WHEN SCORE - (select avg(SCORE) from stdscore where CNAME='JAVA') >= 0 THEN  
                        '普通'  
                    ELSE  
                        '较差'  
                    END  
                ) FROM stdscore b WHERE a.sname=b.sname AND b.CNAME='JAVA' ) AS 'JAVA',  
    (SELECT (  
                    CASE  
                    WHEN SCORE - (select avg(SCORE) from stdscore where CNAME='JAVA') > 20 THEN  
                        '优秀'  
                    WHEN SCORE - (select avg(SCORE) from stdscore where CNAME='JAVA') > 10 THEN  
                        '良好'  
                    WHEN SCORE - (select avg(SCORE) from stdscore where CNAME='JAVA') >= 0 THEN  
                        '普通'  
                    ELSE  
                        '较差'  
                    END  
                ) FROM stdscore b WHERE a.sname=b.sname AND b.CNAME='mysql' ) AS 'mysql'  
    FROM stdscore a  
    

    方法三:

    DROP PROCEDURE  
    IF EXISTS sp_score;  
    DELIMITER &&  
      
    CREATE PROCEDURE sp_score ()  
    BEGIN  
        #课程名称  
        DECLARE  
            cname_n VARCHAR (20) ; #所有课程数量  
            DECLARE  
                count INT ; #计数器  
                DECLARE  
                    i INT DEFAULT 0 ; #拼接SQL字符串  
                SET @s = 'SELECT sname' ;  
                SET count = (  
                    SELECT  
                        COUNT(DISTINCT cname)  
                    FROM  
                        stdscore  
                ) ;  
                WHILE i < count DO  
      
      
                SET cname_n = (  
                    SELECT  
                        cname  
                    FROM  
                        stdscore  
            GROUP BY CNAME   
                    LIMIT i, 1  
                ) ;  
                SET @s = CONCAT(  
                    @s,  
                    ', MAX(CASE cname WHEN ',  
                    '\'',  
                    cname_n,  
                    '\'',  
                    ' THEN (  
                    CASE  
                    WHEN SCORE - (select avg(SCORE) from stdscore where CNAME=\'',cname_n,'\') > 20 THEN  
                        \'优秀\'  
                    WHEN SCORE - (select avg(SCORE) from stdscore where CNAME=\'',cname_n,'\') > 10 THEN  
                        \'良好\'  
                    WHEN SCORE - (select avg(SCORE) from stdscore where CNAME=\'',cname_n,'\') >= 0 THEN  
                        \'普通\'  
                    ELSE  
                        \'较差\'  
                    END  
                ) END)',  
                    ' AS ',  
                    '\'',  
                    cname_n,  
                    '\''  
                ) ;  
                SET i = i + 1 ;  
                END  
                WHILE ;  
                SET @s = CONCAT(  
                    @s,  
                    ' FROM stdscore GROUP BY sname'  
                ) ;   
                #用于调试  
                #SELECT @s;  
                PREPARE stmt  
                FROM  
                    @s ; EXECUTE stmt ;  
                END&&  
      
      
    CALL sp_score ();  
    

    几种方法比较分析
    第一种使用了分组,对每个课程分别处理。
    第二种方法使用了表连接。
    第三种使用了存储过程,实际上可以是第一种或第二种方法的动态化,先计算出所有课程的数量,然后对每个分组进行课程查询。这种方法的一个最大的好处是当新增了一门课程时,SQL语句不需要重写。

    小结
    关于行转列和列转行

    这个概念似乎容易弄混,有人把行转列理解为列转行,有人把列转行理解为行转列;

    这里做个定义:

    行转列:把表中特定列(如本文中的:CNAME)的数据去重后做为列名(如查询结果行中的“Java,mysql”,处理后是做为列名输出);

    列转行:可以说是行转列的反转,把表中特定列(如本文处理结果中的列名“JAVA,mysql”)做为每一行数据对应列“CNAME”的值;

    关于效率

    不知道有什么好的生成模拟数据的方法或工具,麻烦小伙伴推荐一下,抽空我做一下对比;

    还有其它更好的方法吗?

    本文使用的几种方法应该都有优化的空间,特别是使用存储过程的话会更加灵活,功能更强大;

    本文的分级只是给出一种思路,分级的方法如果学生的成绩相差较小的话将失去意义;

    如果小伙伴有更好的方法,还请不吝赐教,感激不尽!

    有些需求可能不需要联合主键

    有些需求可能不需要联合主键,因为一门课程可能允许学生考多次,取最好的一次成绩,或者取多次的平均成绩。
    最简单的case when

    SELECT
    	COUNT(*) AS num,
    	(
    		CASE PAY_TYPE
    		WHEN '0' THEN
    			'微信支付'
    		WHEN '1' THEN
    			'支付宝支付'
    		WHEN '2' THEN
    			'无感支付'
    		WHEN '3' THEN
    			'银联'
    		WHEN '4' THEN
    			'白名单'
    		WHEN '5' THEN
    			'月卡'
    		END
    	) AS type
    FROM
    	t_park_order
    GROUP BY
    	PAY_TYPE;
    
    展开全文
  • 即一中存储了多个属性值。如下表 pk value 1 ET,AT 2 AT,BT 3 AT,DT 4 DT,CT,AT 一般有这两种常见需求(测试数据见文末) 1.得到所有的不重复的值,如 value AT BT CT DT ET SQL...
  • NULL 博文链接:https://wangming2012.iteye.com/blog/1942144
  • hive 行转列/列转行 多行转一行/一行转多行 Mysql 创建表语句: CREATE TABLE student_score( id BIGINT PRIMARY key auto_increment, s_name VARCHAR(20) , s_sub VARCHAR(20), s_score INT ); insert into student_...

    hive 行转列/列转行 多行转一行/一行转多行

    Mysql

    创建表语句:

    CREATE TABLE student_score(
    id BIGINT PRIMARY key auto_increment,
    s_name VARCHAR(20) ,
    s_sub VARCHAR(20),
    s_score INT 
    );
    
    insert into student_score values(null,'张三','数学',90);
    insert into student_score values(null,'张三','语文',85);
    insert into student_score values(null,'张三','英语',92);
    insert into student_score values(null,'李四','数学',88);
    insert into student_score values(null,'李四','语文',91);
    insert into student_score values(null,'李四','英语',99);
    insert into student_score values(null,'王五','数学',100);
    insert into student_score values(null,'王五','语文',82);
    insert into student_score values(null,'王五','英语',88);
    
    
    select * from student_score;
    

    在这里插入图片描述

    行转列

    业务场景,按照上图看的话很难只看同学们的数学成绩或者语文成绩,所以要按照以下格式展示:

    s_name数学语文英语
    张三908592
    李四889199
    李四1008288

    思路:
    第一步可以将每一行根据学科s_sub分成数学,语文,英语三列 , sql语句:

    case  s_sub  when '数学' then s_score else 0 end 数学
    

    完整sql:

    select s_name,
    case s_sub when '数学' then s_score else 0 end 数学,
    case s_sub when '语文' then s_score else 0 end 语文,
    case s_sub when '英语' then s_score else 0 end 英语
    from student_score
    

    结果:
    在这里插入图片描述
    最后,需要按照s_name为维度group by聚合一下

    select s_name,
    sum(case s_sub when '数学' then s_score else 0 end) 数学,
    sum(case s_sub when '语文' then s_score else 0 end) 语文,
    max(case s_sub when '英语' then s_score else 0 end) 英语
    from student_score group by s_name
    

    最终结果:
    在这里插入图片描述
    如果不是int类型而是 varchar 那么上面是行不通的,因为sum里面不能跟字符串,需要用group_concat()函数替代sum,可先看多行转一行之后再看下方sql

    select s_name,
    GROUP_CONCAT(case s_sub when '数学' then  CAST(s_score AS char) else null end) 数学,
    GROUP_CONCAT(case s_sub when '语文' then  CAST(s_score AS char) else null end) 语文,
    GROUP_CONCAT(case s_sub when '英语' then  CAST(s_score AS char) else null end) 英语
    from student_score group by s_name
    

    多行转一行

    业务场景,以张三为例,将张三的三个成绩拼接成字符串 放到一个单元格中显示:

    '张三'    '数学:90,语文:85,英语92'
    

    上述 类似于

    select s_name, sum(s_score) from student_score group by s_name
    

    sum 就是一个聚合函数,只不过它是将所有的数字相加得到结果,根据上面业务场景,此时要用到一个函数 group_concat ,类似于sum 但是它的作用是将聚合后的数据进行字符拼接
    group_concat (a,b,c,… separator ’ ‘) 或者
    group_concat (a,b,c,…)
    group_concat 中的参数是可变参数,多个参数拼接,最后一个speparator xxx 是多行数据拼接后的分隔符,如果不写默认的分隔符是’,'逗号.并且记住要用group by 维度聚合,不写group by 会拼接所有的行
    完整的sql:

    select s_name,group_concat(s_sub,':',s_score separator '@') all_score from  student_score group by s_name
    

    结果:
    在这里插入图片描述

    列转行

    首先要用到上面行转列的数据

    create table student_score2 as 
    select s_name,
    sum(case s_sub when '数学' then s_score else 0 end) 数学,
    sum(case s_sub when '语文' then s_score else 0 end) 语文,
    max(case s_sub when '英语' then s_score else 0 end) 英语
    from student_score group by s_name
    

    在这里插入图片描述
    下面是实现列转行的sql

    SELECT
    	s_name,
    	'数学' AS s_sub,
    	数学 AS s_score
      FROM s_score
    UNION
    SELECT
    	s_name,
    	'语文' AS s_sub,
    	语文 AS s_score
      FROM s_score
    UNION
    SELECT
    	s_name,
    	'英语' AS s_sub,
    	英语 AS s_score
      FROM s_score
    

    结果
    在这里插入图片描述

    一行转多行

    一行转多行在关系型数据库中是有点儿矛盾的,因为关系型数据库设计原则就是单条数据不能再分,如果需要再分是外部(hive/java程序)分完之后进入关系型数据库的,虽然矛盾,但是也是可以实现的.
    创建表:

    create table student_score3 as
    select s_name,group_concat(s_sub,':',s_score separator '@') all_score 
    from  student_score group by s_name
    

    先sql再说思路:

    SELECT
     a.s_name,
     substring_index( substring_index( a.all_score, '@', b.id), '@',- 1 )
    FROM
     student_score3 a
     JOIN account b ON 
     b.id <= ( length( a.all_score ) - length( replace( a.all_score, '@', '' ) ) + 1 );
    

    account表是作为辅助结构的提供1-n个自增长数字
    在这里插入图片描述
    查询结果:
    在这里插入图片描述

    思路:(根据sql思想一步步替换成可执行的sql)

    ①根据张三的一条数据来看:首先,把张三分成三条,三是all_score中想切分成的元素个数决定的

    name    index          all_score
    张三      1         数学:90@语文:85@英语:92
    张三      2         数学:90@语文:85@英语:92
    张三      3         数学:90@语文:85@英语:92
    

    上图sql思想是:

    select a.s_name, allscore from a join b on n <= all_score_arr.size(); n>=1
    --这样子可以根据n的个数join出n条数据.
    

    ②转化成下面我们想要的这样:

    name    index       score
    张三      1         数学:90
    张三      2         语文:85
    张三      3         英语:92
    

    如果把all_score看成一个数组的话,刚好score就是取的all_score_arr的第index个元素
    可以得出sql的思路:

    select a.s_name,all_score_arr[n] from a join b on n <= all_score_arr.size();
    

    如果把上面的sql转换成mysql可以执行的sql语句,就能完成多行转一行的目的.

    ③初步思路有了以后,先看mysql的函数
    先是函数 substring_index(str,sp,x)
    str是要切分的字符串,sp指分隔符,x是int类型通过下面sql

    select substring_index(all_score,'@',x) from student_score3;
    

    可以看规律 x 为1 结果是’数学:90’,x为2 结果是’数学:90@语文85’(从右往左取)
    x为-1 结果是’英语:90’,x为-2 结果是’语文:85@英语;92’(从左往右取)
    所以要用两个substring_index()函数来实现类似于将字符串all_score根据@切分成数组再根据all_score_arr索引取元素.
    substring_index( substring_index( all_score, ‘@’, n), ‘@’,- 1 )
    n= 1时 取的是’数学:90’
    n = 2时 取的是’语文:85’

    这就完成了模拟数组取元素
    所以all_score_arr[n] 可以用 substring_index( substring_index( all_score, ‘@’, n), ‘@’,- 1 )替代:

    select a.s_name,substring_index( substring_index( all_score, '@', n), '@',- 1 )
    from a join b on n <= all_score_arr.size();
    

    n代表着整数可以通过另外一个表的自增主键来替代,b.id就代表了从1-n的整数,得到下面sql:

    select a.s_name,substring_index( substring_index( all_score, '@', b.id), '@',- 1 )
    from a join b on b.id <= all_score_arr.size();
    

    将a与b与实际的表进行替换

    select a.s_name,substring_index(substring_index( all_score, '@', b.id), '@',- 1 )
    from student_score2 a join account b on b.id <= all_score_arr.size();
    

    all_score_arr.size()也就是元素的个数应该如何表示呢?
    可以通过(分隔符+1)来表示元素个数,
    length( a.all_score ) 是字符长度 length( replace( a.all_score, ‘@’, ‘’ ) ) 是去掉分隔符后的长度
    两者相减就得到分隔符数,分隔符数加1就是元素个数
    所以arr.size() 可以用 length( a.all_score ) - length( replace( a.all_score, ‘@’, ‘’ ) ) + 1 表示
    替换后得到最终结果:

     select a.s_name,substring_index( substring_index( a.all_score, '@', b.id+ 1 ), '@',- 1 ) 
     from a join b on b.id<= ( length( a.all_score ) - length( replace( a.all_score, '@', '' ) ) + 1 );
    
    展开全文
  • MYSQL 行转列优化

    2020-04-30 15:21:38
    背景:mysql里写了一个存储过程,需要把一个详情表里的某一列里的不同值转成...优化后:详情表分组,然后判断目标列的值把每个值都转列,具体sql语句是: SELECT ID, MAX(CASE KEY WHEN 'SD' THEN DATE_FORMAT(END...

    背景:mysql里写了一个存储过程,需要把一个详情表里的某一列里的不同值转成列名,并取其他列的数据。

    优化前:筛选详情表目标列每个值,然后和主表关联,目标列有6个不同值,关联6次,存储过程的执行时间是25s.

    优化后:详情表分组,然后判断目标列的值把每个值都转列,执行时间0.5s,快了很多,具体sql语句是:

    SELECT ID,
    MAX(CASE KEY WHEN 'SD' THEN DATE_FORMAT(END_TIME_, '%Y-%m-%d') ELSE NULL END) AS SAD
    FROM TABLE_NAME
    GROUP BY ID

    还有稍微复杂一点,判断多个值然后把这多个值转成一列,具体sql语句是:

    SELECT ID,
    MAX(CASE KEY WHEN 'OM' THEN ASSIGNEE	
                 WHEN 'PM' THEN ASSIGNEE 
                 WHEN 'TM' THEN ASSIGNEE ELSE	NULL END) AS MO
    FROM TABLE_NAME
    GROUP BY ID

     

    展开全文
  • 顺道也总结一下行转列   话不多说,现在开始 ~~       行转列:   转换之前的表格,第三、四列分别为特征和数值 图1     首先看第一次的执行sql: select id , name , (case ...

    最近工作用到了好几次列转行,做个小总结。顺道也总结一下行转列

     

    行转列:

    转换之前的表格,第三、四列分别为特征和数值

    图1

     
    首先看第一次的执行sql:

    select
     id , name ,
     (case 特征 when '年龄' then 数值 else 0 end) as age,
     (case 特征 when '身高' then 数值 else 0 end) as height,
     (case 特征 when '体重' then 数值 else 0 end) as weight
    from user2
    

     
    第一次的执行sql效果:

    图2

     
    行转列关键点一
    1、首先行转列的第一个关键点是用到了case when then else end , 查询出的图2新的表格3、4、5列(age、height、weight)是根据图1的表格第3列特征那列的三种情况(身高、体重、年龄)来当作列名的,然后再取别名as ageas heightas weight。此时新表格的列已定好,行数还未发生改变,呈现图二这种情况

     
    再来看一下第二次的执行sql:

    select
     id , name ,
     max(case 特征 when '年龄' then 数值 else 0 end) as age,
     max(case 特征 when '身高' then 数值 else 0 end) as height,
     max(case 特征 when '体重' then 数值 else 0 end) as weight
    from user2
     group by name
    

     
    第二次的执行sql效果:

    图3

     
    行转列关键点二
    2、相比于第一次sql,第二次sql多了group bymax,这也是行转列的第二个关键点,将数据进行分组,再取每列的最大值。小明在图2中是三条数据,通过max取每列的最大使得三条数据合并为一条数据,至此出现图3这种我们需要的效果
     
     
    注意:
    1、行转列时需要转换的行中的值不可为非数字,否则影响max()的使用

     
     

    列转行:

    转换之前的表格,第三、四、五列分别为age、height、weight

    图4

     
    执行sql:

    select id , name , '年龄' as 特征 , age as 数值 from user
     union
      select id , name , '身高' as 特征 , height as 数值 from user
       union 
        select id , name , '体重' as 特征 , weight as 数值 from user
         order by id
    

     
    执行sql之后的效果

    图5

     
    相对于行转列,列转行就显得更简单一些,只用到了一个union

    列转行关键点:
    union,使用'年龄' as 特征、'身高' as 特征、'体重' as 特征 来确定图5第3列的列名与每行数据该列的值,使用age as 数值、height as 数值、weight as 数值来确定图5第4列的列名与每行数据该列的值,3个select 查询出3张表格,再通过union连接成一张表格

    union注意点
    使用union连接表时需要注意表的字段一致,此处我们3个select 查询出3张表格字段是一致的。

    展开全文
  • NULL 博文链接:https://pmandy-163-com.iteye.com/blog/789326
  • mysql行转列汇总数据

    2020-06-03 21:19:10
    最近找工作面试的时候做了这一道题: score表: 要求根据score表汇总为下面这种: 这道题要用到汇总,所以我们要用 sum函数,一个人对应一条数据,所以我们要对name进行group by分组: ...SUM(CASE WHEN s....
  • mysql行转列,使用json_objectagg实现

    千次阅读 2020-10-01 22:29:49
    } 下面是执行计划,其他测试暂时没做,空了看看这种sql效率会如何 以上就是mysql行转列的实现。 下面是经历 客户有一个需求,页面数据是动态列或者动态属性(相当于没有固定的entity),同一模型下不同类型对应的...
  • mysql行转列、列转行

    千次阅读 2017-04-07 11:04:35
    这里我偷懒了,将行转列的结果作为视图,没有重新建表,效果是一样的。 SELECT * FROM ( SELECT `year` , 1 AS 'month' , `m1` AS amount FROM ffe UNION SELECT `year` , 2 AS...
  • 如下所示: SELECT count(DISTINCT(a.rect_id)) zcount, a.job_dept,  DATE_FORMAT(submit_date, '%Y-%m') zsubmit_date  FROM  表名 a  WHERE  a.statu = 3  AND a.rstatu = 2  AND a.job_dept IN ('19', '...
  • mysql行转列(列不固定)

    千次阅读 2019-11-25 11:20:52
    使用场景:由于题目的选项按存储在数据库中,并且选项数量不是固定的,如下图 使用sql语句如下 SELECT questionitem.questionId, IF(length(GROUP_CONCAT(questionitem.content))-length(replace(GROUP_CONCAT...
  • Mysql 行转列,列转行

    千次阅读 2018-06-19 15:59:49
    这也是一个典型的行转列的例子。我们可以通过下面的脚本来达到目的 SELECT CreateTime, CASE PayType WHEN '支付宝' THEN SUM(Money) ELSE 0 END AS '支付宝', CASE PayType WHEN '手机短信' THEN SUM(Money) ...
  • MySQL行转列与列转行 case when 用法

    千次阅读 2018-12-14 13:47:34
    MySQL行转列与列转行 行转列 例如:把图1转换成图2结果展示 图1    图2   1 2 3 4 5 6 7 CREATE TABLE `TEST_TB_GRADE` (  `ID` int(10) NOT NULL...
  • -- 行转列统计数据 -- ------------------------ SELECT DATE_FORMAT(create_time,'%Y-%m-%d') days, SUM(CASE name WHEN 'QQ' THEN count ELSE 0 END ) QQ, SUM(CASE name WHEN '微信' THEN ...
  • mysql 行转列

    2019-05-21 20:06:00
    mysql 行转列 1.表数据 2.结果数据 CREATE TABLE `TEST_TB_GRADE` ( `ID` int(10) NOT NULL AUTO_INCREMENT, `USER_NAME` varchar(20) DEFAULT NULL, `COURSE` varchar(20) DEFAULT NULL, `SCORE` float...
  • mysql行转列

    千次阅读 2019-01-17 11:03:53
    mysql 储存.sql文件 /* Navicat MySQL Data Transfer Source Server : localhost_3306 Source Server Version : 80012 Source Host : localhost:3306 Source Database : test Target Server T...
  • mysql 行转列 (带日期)

    千次阅读 2017-11-11 16:51:09
    从网上找了很多行转列的。基本都是2行的行转列。不带日期分组的。 借鉴了另一个哥们的文章,实现了自己想要的结果,写出来大家可以参考。以后自己遇到同样情况,也可以有个备份 借鉴的地址为 ...
  • mysql 行转列分类统计数量

    千次阅读 2017-03-09 10:06:38
    mysql通过行转列根据表中某一字段进行分类统计数量
  • mysql中根据符号;进行分割,并分行展示。 解决方案 其中title是信息标题,company是公司名称。(基于真实项目实战,字段做了处理) select t.title,t.company from xxx t SELECT a.title,SUBSTRING_INDEX( ...
  • 根据某个字段值,如根据“,”分割,行转成多可以借助一个序号表,该表中除了连续的ids没有其它字段,ids的值范围取决于"一"中存储的信息拆分后的数量(可以是大于等于这个数量)。SELECT ids,id,APPLY_ID...
  • mysql行转列转换

    万次阅读 多人点赞 2017-08-23 16:16:38
    其中最为头痛的就是多行,动态的列行转换。最近在研究这些行里转换,还是从最为简单的行列转换开始。sql 脚本 -- 创建表 学生表 CREATE TABLE `student` ( `stuid` VARCHAR(16) NOT NULL COMMENT '学号', `...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 113,897
精华内容 45,558
关键字:

mysql行转列

mysql 订阅