• sql-行列转换


     group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc ] [separator '分隔符'] )

    SELECT GROUP_CONCAT(DISTINCT NAME),mon FROM sale GROUP BY mon

     

     SELECT a.`name`,a.mon,

    SUM(CASE RIGHT(a.mon,2) WHEN '01'  THEN sa ELSE 0 END) '01月',
    SUM(CASE RIGHT(a.mon,2) WHEN '02'  THEN sa ELSE 0 END) '02月',
    SUM(CASE RIGHT(a.mon,2) WHEN '03'  THEN sa ELSE 0 END) '03月',
    SUM(CASE RIGHT(a.mon,2) WHEN '04'  THEN sa ELSE 0 END) '04月',
    SUM(CASE RIGHT(a.mon,2) WHEN '05'  THEN sa ELSE 0 END) '05月',
    SUM(CASE RIGHT(a.mon,2) WHEN '06'  THEN sa ELSE 0 END) '06月',
    SUM(CASE RIGHT(a.mon,2) WHEN '07'  THEN sa ELSE 0 END) '07月',
    SUM(CASE RIGHT(a.mon,2) WHEN '08'  THEN sa ELSE 0 END) '08月',
    SUM(CASE RIGHT(a.mon,2) WHEN '09'  THEN sa ELSE 0 END) '09月',
    SUM(CASE RIGHT(a.mon,2) WHEN '10'  THEN sa ELSE 0 END) '10月',
    SUM(CASE RIGHT(a.mon,2) WHEN '11'  THEN sa ELSE 0 END) '11月',
    SUM(CASE RIGHT(a.mon,2) WHEN '12'  THEN sa ELSE 0 END) '12月'

    FROM sale a

    GROUP BY a.mon

    行转列列传行更具体例子

       1、查看数据

    Sql代码  收藏代码
    1. SELECT  * FROM tabName ;  

       

       2、列转行统计数据

    Sql代码  收藏代码
    1. SELECT DATE ,  
    2.     MAX(CASE NAME WHEN '小说' THEN Scount ELSE 0 END ) 小说,  
    3.     MAX(CASE NAME WHEN '微信' THEN Scount ELSE 0 END ) 微信   
    4. FROM TabName    
    5. GROUP BY DATE  

    3、行转列
    Sql代码  收藏代码
    1. SELECT DATE,GROUP_CONCAT(NAME) FROM tabname GROUP BY DATE  

     

    4、行转列统计数据

    Sql代码  收藏代码
    1. SELECT DATE, GROUP_CONCAT(NAME,'总量:',Scount) AS b_str FROM tabName GROUP BY DATE  
       
    Sql代码  收藏代码
    1. SELECT DATE,NAME, GROUP_CONCAT(NAME,'总量:',Scount) AS b_str FROM   TabName GROUP BY DATE ,NAME  

    mysql 逗号分隔的id转为逗号分隔的名称

    SELECT b.id,b.all_source_id,GROUP_CONCAT(a.`name`) AS sname
    FROM sit_uiresources a
    JOIN sit_verify b ON FIND_IN_SET(a.id,b.all_source_id) > 0
    GROUP BY b.id

    mysql 逗号分隔的id转为逗号分隔的名称

    有两张表,职位表(rec_job)和职位类别表(rec_job_type),其中 rec_job 表的 all_sub_job_types 字段存的是逗号隔开的职位类别ID,rec_job 表结构如下:

    +--------+---------------------------+
    |      id    |   all_sub_job_types  | 
    +--------+---------------------------+
    |  1022   |             1,4,6             | 
    |  1023   |             5,8,9             | 

    现在根据 all_sub_job_types 列的 id 字符串,从rec_job_type表查找对应的 name:

    SELECT a.id,GROUP_CONCAT(b.type_name) as type_name
    FROM rec_job a
    LEFT JOIN rec_job_type b 
    ON FIND_IN_SET(b.id,a.all_sub_job_types)
    where id = 1022

    得到结果:

    如果想将英文逗号换成中文逗号,可以用REPLACE函数或者这样写: 

     GROUP_CONCAT(b.type_name order by b.type_name desc separator '')  

     +++++++++++++++++每次遇到类似的问题,都得百度,所以记录下来方便以后使用+++++++++++++++++++++

    group_contact 函数:

    它主要配合 group by 使用,起着分组时,将涉及行的相应的字段串联成一个逗号隔开的字符串,

    group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc ] [separator '分隔符'] )
    
    说明:通过使用distinct可以排除重复值;如果希望对结果中的值进行排序,可以使用order by子句;separator是一个字符串值,缺省为一个逗号。
    需要注意的是,group_concat默认是1024 字节,所以对应字段的长度需要考虑。

    FIND_IN_SET函数:

    功能类似于 IN 函数,IN一般用说 id in (4,5,6,7),如果4,5,6是一个变量时,就需要用FIND_IN_SET函数。

    复制代码
    FIND_IN_SET(str,strlist)
    
    str 要查询的字符串
    strlist 字段名 参数以”,”分隔 如 (1,2,6,8)
    查询字段(strlist)中包含(str)的结果,返回结果为null或记录
    
    假如字符串str在由N个子链组成的字符串列表strlist 中,则返回值的范围在 1 到 N 之间。 
    一个字符串列表就是一个由一些被 ‘,’ 符号分开的子链组成的字符串。
    如果第一个参数是一个常数字符串,而第二个是type SET列,则FIND_IN_SET() 函数被优化,使用比特计算。
    如果str不在strlist 或strlist 为空字符串,则返回值为 0 。
    如任意一个参数为NULL,则返回值为 NULL。这个函数在第一个参数包含一个逗号(‘,’)时将无法正常运行。
  • 相关阅读:
    整数参数求和
    《Objective-C 程序设计》读后感
    构建之法前三章精读读后感
    《java编程思想》读后感
    《JAVA核心技术》观后感
    构建之法读后感
    一、构建之法读后感
    开发MIS系统需要的技术及其含义、作用
    阅读笔记一
    Java课后练习9(异常处理)
  • 原文地址:https://www.cnblogs.com/jentary/p/11579319.html
Copyright © 2020-2023  润新知