精华内容
下载资源
问答
  • mysql行转列、列转行示例
    千次阅读
    2021-01-28 06:52:53

    最近在开发过程中遇到问题,需要将数据库中一张表信息进行行转列操作,再将每列(即每个字段)作为与其他表进行联表查询的字段进行显示。

    借此机会,在网上查阅了相关方法,现总结出一种比较简单易懂的方法备用。

    一、行转列:将原本同一列下多行的不同内容作为多个字段,输出对应内容。

    效果图:

    数据库表中的内容:

    95c2622b8c15bb3d8583c7eaeb66fda1.png

    转换后:

    28036e02aba4ac6ed0e534e1503eb1ef.png

    可以看出,这里行转列是将原来的f_subject字段的多行内容选出来,作为结果集中的不同列,并根据f_student_id进行分组显示对应的f_score;

    上SQL:

    selectf_student_id,SUM(IF(f_subject='语文',f_score,0)) as '语文',SUM(IF(f_subject='数学',f_score,0)) as '数学',SUM(IF(f_subject='英语',f_score,0)) as '英语'

    fromt_student_scoreGROUP BY f_student_id;

    注意点:

    1.SUM()是为了能够使用GROUP BY根据f_student_id进行分组,因为每一个student_id对应的f_subject="语文"的记录只有一条,所以SUM()的值就等于对应那一条记录的f_score的值。

    假如f_student_id ='0001' and f_subject='语文' 的记录有两条,则此时SUM()的值将会是这两条记录的和,同理,使用Max()的值将会是这两条记录里面值最大的一个。但是正常情况下,一个student对应一个subject只有一个分数,因此可以使用SUM()、MAX()、MIN()、AVG()等聚合函数都可以达到行转列的效果。

    2.IF(f_subject='语文',f_score,0)作为条件,即对所有f_subject='语文'的记录的f_score字段进行SUM()、MAX()、MIN()、AVG()操作,如果f_score没有值则默认为0;

    二、列转行:

    效果图:(上面的图位置交换)

    本质是将f_student_id 的每个科目分数分散成一条记录显示出来。

    直接上SQL:

    select f_id,f_student_id,'语文' as f_subject,f_chinese as f_score fromt_student_subjectUNION ALL

    select f_id,f_student_id,'数学' as f_subject,f_math as f_score fromt_student_subjectUNION ALL

    select f_id,f_student_id,'英语' as f_subject,f_english as f_score from t_student_subject

    这里将每个student_id对应的多个科目的成绩查出来,通过UNION ALL将结果集加起来,达到图1的效果。

    附:UNION与UNION ALL的区别(摘):

    1.对重复结果的处理:UNION会去掉重复记录,UNION ALL不会;

    2.对排序的处理:UNION会排序,UNION ALL只是简单地将两个结果集合并;

    3.效率方面的区别:因为UNION 会做去重和排序处理,因此效率比UNION ALL慢很多;

    更多相关内容
  • mysql行转列、列转行  语句不难,不做多余解释了,看语句时,从内往外一句一句剖析 行转列  有如图所示的表,现在希望查询的结果将行转成列  建表语句如下: CREATE TABLE `TEST_TB_GRADE` ( `ID` int(10) NOT...
  • Mysql 行转列,列转行 SQL语句和示例表结构SQL Mysql 行转列,列转行 SQL语句和示例表结构SQL
  • NULL 博文链接:https://wangming2012.iteye.com/blog/1942144
  • MySQL 中行转列的方法

    2021-01-19 21:39:10
    MySQL行转列操作  所谓的行转列操作,就是将一个表的行信息转化为列信息,说着可能比较笼统,这里先举个例子,如下: +----+-----------+--------+-------+ | ID | USER_NAME | COURSE | SCORE | +----+----------...
  • MySQL行转列

    2021-11-26 21:02:10
    MySQL中,有字段存储类型为varchar,值为用某个符号分割的数组,如何进行行转列? 整体思路:利用mysql.help_topic中从0开始自增help_topic_id字段和想要行转列的表进行join产生笛卡尔积,运用MySQL的substring_...

    在MySQL中,有字段存储类型为varchar,值为用某个符号分割的数组,如何进行行转列?

    整体思路:利用mysql.help_topic中从0开始自增help_topic_id字段和想要行转列的表进行join产生笛卡尔积,运用MySQL的substring_index(str,delim,count)函数将字段一个一个分割。

    substring_index(str,delim,count)
    str:要处理的字符串
    delim:分隔符
    count:计数(如果是正数,从左至右截取count个,负数则从右至左截取count个)

    select substring_index('2,3,4,5,6',',',2);
    在这里插入图片描述
    select substring_index('2,3,4,5,6',',',-2);
    在这里插入图片描述

    创建测试表

    create table test.test_mysql_hangzhuanlie (
      id bigint(20) not null auto_increment comment '主键',
      username varchar(50) default null,
      tags varchar(50) default null,
      primary key (id)
    ) engine=innodb auto_increment=650 default charset=utf8mb4 comment='测试表'
    

    导入测试数据

    insert into test.test_mysql_hangzhuanlie values (1, '李威', '6,9,8'), (2, '李白', '2,6,3');
    

    行转列

    select t1.id, t1.username, substring_index(substring_index(t1.tags, ',', t2.help_topic_id + 1), ',',- 1) as tag
      from test.test_mysql_hangzhuanlie as  t1 
      join mysql.help_topic as t2
        on t2.help_topic_id < (length(t1.tags) - length(REPLACE(t1.tags, ',', '')) + 1)
    ;
    

    在这里插入图片描述

    展开全文
  • mysql行转列(将同一列下的不同内容的几行数据,转换成几列显示)、列转行、行列汇总、合并显示
  • MySql行转列&列转行

    千次阅读 2022-01-09 15:26:38
    行转列: 创建语句: create table test1( id int auto_increment primary key , name varchar(255), course varchar(255), score int ) insert into test1(name,course,score) values ('张三','语文',120); insert...

    行转列:

    创建语句:

    create table test1(
    id int  auto_increment primary key ,
    name varchar(255),
    course varchar(255),
    score int
    )
    
    insert into test1(name,course,score) values ('张三','语文',120);
    insert into test1(name,course,score) values ('张三','数学',100);
    insert into test1(name,course,score) values ('张三','英语',82);
    insert into test1(name,course,score) values ('李四','语文',89);
    insert into test1(name,course,score) values ('李四','数学',99);
    insert into test1(name,course,score) values ('李四','英语',87);
    insert into test1(name,course,score) values ('王五','语文',78);
    insert into test1(name,course,score) values ('王五','数学',85);
    insert into test1(name,course,score) values ('王五','英语',145);
    insert into test1(name,course,score) values ('王五','物理',40);
    insert into test1(name,course,score) values ('王五','化学',62);
    

    原始数据:
    在这里插入图片描述

    1、第一种方法:

    
    -- 使用case when then else,这里使用sum函数也可以
    select name,
    max(case course when '语文' then score else 0 end)as 'chinese',
    max(case course when '数学' then score else 0 end)as 'math',
    max(case course when '英语' then score else 0 end)as 'english',
    max(case course when '物理' then score else 0 end)as 'wuli',
    max(case course when '化学' then score else 0 end)as 'huaxue'
    from test1 group by name
    

    第一种结果:
    在这里插入图片描述
    2、第二种方法:

    -- 使用if语句,这里使用sum函数也可以
    select name,
    max(if(course = '语文',score,0))as 'chinese',
    max(if(course = '数学',score,0))as 'math',
    max(if(course = '英语',score,0))as 'english',
    max(if(course = '物理',score,0))as 'wuli',
    max(if(course = '化学',score,0))as 'huaxue'
    from test1 group by name
    

    第二种结果:
    在这里插入图片描述
    3、第三种方法:

    -- 动态拼接sql语句,不管多少行都会转列
    set @sql = null;
    select group_concat(distinct concat('max(if(a.course = ''',a.course,''', a.score, 0)) as ''',a.course, '''')) into @sql from test1 a;
    set @sql = concat('select name,', @sql, 'from test1 a group by a.name' );
    prepare stmt from @sql;  -- 动态生成脚本,预备一个语句
    execute stmt;            -- 动态执行脚本,执行预备的语句
    deallocate prepare stmt; -- 释放预备的语句 
    
    -- 通过这个查询拼接的sql
    select @sql
    

    第三种结果:
    在这里插入图片描述
    查询出来的sql结果:

    -- 查询出来的结果
    select name,max(if(a.course = '语文', a.score, 0)) as '语文',max(if(a.course = '数学', a.score, 0)) as '数学',max(if(a.course = '英语', a.score, 0)) as '英语',max(if(a.course = '物理', a.score, 0)) as '物理',max(if(a.course = '化学', a.score, 0)) as '化学',max(if(a.course = '政治', a.score, 0)) as '政治'from test1 a group by a.name
    

    在这里插入图片描述

    4、第四种方法:

    -- 使用distinct
    select distinct  a.name,  
    (select score from test1 b where a.name=b.name and b.course='语文' ) as 'chinese',  
    (select score from test1 b where a.name=b.name and b.course='数学' ) as 'math',
    (select score from test1 b where a.name=b.name and b.course='英语' ) as 'english',  
    (select score from test1 b where a.name=b.name and b.course='物理' ) as 'wuli',  
    (select score from test1 b where a.name=b.name and b.course='化学' ) as 'huaxue'  
    from test1 a
    

    第四种结果:
    在这里插入图片描述
    5、第五种方法:
    以下三种方法是可以做统计的用的,有三种统计写法,有需求的话可以使用

    -- 使用with rollup统计第一种
    select ifnull(name,'总计') as name,
    max(if(course = '语文',score,0))as 'chinese',
    max(if(course = '数学',score,0))as 'math',
    max(if(course = '英语',score,0))as 'english',
    max(if(course = '物理',score,0))as 'wuli',
    max(if(course = '化学',score,0))as 'huaxue',
    sum(IF(course='total',score,0)) as 'total'
    from (select name,ifnull(course,'total') as course,sum(score) as score
    from test1 group by name, course with rollup having name is not null )as a group by name with rollup;
    
    
    -- 使用with rollup与union all统计第二种
    select name,
    max(if(course = '语文',score,0))as 'chinese',
    max(if(course = '数学',score,0))as 'math',
    max(if(course = '英语',score,0))as 'english',
    max(if(course = '物理',score,0))as 'wuli',
    max(if(course = '化学',score,0))as 'huaxue',
    sum(score) as total from test1 group by name
    union all
    select 'total',
    max(if(course = '语文',score,0))as 'chinese',
    max(if(course = '数学',score,0))as 'math',
    max(if(course = '英语',score,0))as 'english',
    max(if(course = '物理',score,0))as 'wuli',
    max(if(course = '化学',score,0))as 'huaxue',
    sum(score) from test1
    
    
    -- 使用if与with rollup统计
    select ifnull(name,'total') as name,
    max(if(course = '语文',score,0))as 'chinese',
    max(if(course = '数学',score,0))as 'math',
    max(if(course = '英语',score,0))as 'english',
    max(if(course = '物理',score,0))as 'wuli',
    max(if(course = '化学',score,0))as 'huaxue',
    sum(score) AS total 
    from test1
    group by name with rollup
    

    第五种结果:
    以上三种语句结果都是一样的
    在这里插入图片描述

    6、第六种方法:

    -- 使用group_concat,这个一般不推荐
    select name,
    group_concat(course,':',score separator '@')as course
    from test1 group by name
    

    第六种结果:
    在这里插入图片描述
    7、第七中方法:

    -- 这个也不推荐使用
    set @EE='';
    select @EE :=concat(@EE,'sum(if(course= \'',course,'\',score,0)) as ',course, ',') as aa from (select distinct course from test1) a ;
    set @QQ = concat('select ifnull(name,\'total\')as name,',@EE,' sum(score) as total from test1 group by name with rollup');
    -- SELECT @QQ;
    prepare stmt from @QQ;
    execute stmt;
    deallocate prepare stmt;
    

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

    列转行

    创建语句:

    create table test2(
    id int  auto_increment primary key ,
    name varchar(255) ,
    chinese int,
    math int,
    english int,
    wuli int,
    huaxue int
    )
    
    insert into test2(name,chinese,math,english,wuli,huaxue) values ('张三',110,120,85,null,null);
    insert into test2(name,chinese,math,english,wuli,huaxue) values ('李四',130,88,89,null,null);
    insert into test2(name,chinese,math,english,wuli,huaxue) values ('王五',93,124,87,98,67);
    

    原始数据:
    在这里插入图片描述
    1、第一种方法:
    有两种写法:

    unionunion all的区别就是:
    union可以去除重复结果集,union all不会去除重复的结果集  
    
    -- 第一种使用union实现列传行
    select name,'语文' as course, chinese as 'score' from test2 union 
    select name,'数学' as course, math as 'score' from test2 union 
    select name,'英语' as course, english as 'score' from test2 union 
    select name,'物理' as course, wuli as 'score' from test2 union 
    select name,'化学' as course, huaxue as 'score' from test2 order by name asc
    
    -- 第二种写法可以对null值结果集处理
    select * from
    (select name,'语文' as course, chinese as 'score' from test2 union 
    select name,'数学' as course, math as 'score' from test2 union 
    select name,'英语' as course, english as 'score' from test2 union 
    select name,'物理' as course, wuli as 'score' from test2 union 
    select name,'化学' as course, huaxue as 'score' from test2)a
    where a.score is not null order by name asc
    

    第一种结果:
    有null结果:
    在这里插入图片描述
    没有null结果:
    在这里插入图片描述

    展开全文
  • mysql动态行转列

    2016-11-04 14:13:22
    mysql动态行转列的例子
  • 即一中存储了多个属性值。如下表 pk value 1 ET,AT 2 AT,BT 3 AT,DT 4 DT,CT,AT 一般有这两种常见需求(测试数据见文末) 1.得到所有的不重复的值,如 value AT BT CT DT ET SQL...
  • 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;
    
    展开全文
  • mysql行转列,函数GROUP_CONCAT(expr)

    千次阅读 2021-01-18 18:59:46
    demo:语句:SELECT '行' id, '' product_nameUNIONSELECT id, product_name ... 5结果:行1icbc2测试测试314笔记本电脑语句:SELECT '行转列后' id, '' product_nameUNIONSELECT GROUP_CONCAT(id) id, GROUP_CONCA...
  • MYSQL列转行的两种做法
  • 如下所示: 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', '...
  • NULL 博文链接:https://pmandy-163-com.iteye.com/blog/789326
  • mysql行转列(多行转一列)

    千次阅读 2021-01-19 05:17:40
    场景比如说一个订单对应多条数据,当状态(status)=1的时候, 数量(num)=25,当状态(status)=2的时候, 数量(num)=45,现在想用一条sql记录下不同状态对应的数量为多少,如下图所示:期待结果->...
  • MySQL行转列与列转行(实现过程)

    千次阅读 2020-08-07 16:02:26
    顺道也总结一下行转列   话不多说,现在开始 ~~       行转列:   转换之前的表格,第三、四列分别为特征和数值 图1     首先看第一次的执行sql: select id , name , (case ...
  • MYSQL 行转列优化

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

    千次阅读 多人点赞 2022-01-09 23:43:03
      MySQL行转列,对经常处理数据的同学们来说,一定是不陌生的,甚至是印象深刻,因为它大概率困扰到了你,让你为之一愣~ 但当你看到本文后,这个问题就不在是问题,及时收藏,以后谁再问你这个问题,直接甩他脸上...
  • 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行转列、列转行 1.行转列   有如图所示的表,现在希望查询的结果将行转成列(语文,数学,英文变成列):   使用如下查询语句实现行转列: select id,name, max(case when course = '语文' then score else ...
  • mysql行转列(列不固定)

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

    千次阅读 2017-04-07 11:04:35
    这里我偷懒了,将行转列的结果作为视图,没有重新建表,效果是一样的。 SELECT * FROM ( SELECT `year` , 1 AS 'month' , `m1` AS amount FROM ffe UNION SELECT `year` , 2 AS...
  • 行转列首先我们先创建一个表 表如下 CREATE TABLE test_hjsjy_1( `id` int(10) NOT NULL AUTO_INCREMENT, `user_name` varchar(20) DEFAULT NULL, `course` varchar(20) DEFAULT NULL, `score` float DEFAULT...
  • mysql行转列转换

    千次阅读 2018-07-24 10:56:55
    其中最为头痛的就是多行,动态的列行转换。最近在研究这些行里转换,还是从最为简单的行列转换开始。 sql 脚本 -- 创建表 学生表 CREATE TABLE `student` ( `stuid` VARCHAR(16) NOT NULL COMMENT '学号'...
  • mysql 行转列示例.pdf

    2021-08-07 14:51:24
    mysql 行转列示例.pdf

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 133,296
精华内容 53,318
关键字:

mssql 行转列