`

SQL进行条件统计:GROUP_CONCAT 行转列

    博客分类:
  • DB
阅读更多

 

 (编写不易,转载请注明: https://shihlei.iteye.com/blog/2442053)

一 概述

    继续支持运营出统计数据,需要行转列,看来下 GROUP_CONCAT 函数,做个记录。

 

二 场景

1) 表结构

员工表employee 

id, name , type , age, leader

 

CREATE TABLE `employee`(
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT 'id',
`name` VARCHAR(100) NOT NULL COMMENT '姓名',
`type` VARCHAR(2) NOT NULL COMMENT '类别 A,B,C',
`age` INT(2) NOT NULL COMMENT '年龄',
`leader` VARCHAR(100) NOT NULL COMMENT '组长',
  PRIMARY KEY (`id`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='员工表';

insert into `employee`(`name`,`type`,`age`,`leader`) values 
('name_10','A',10,'tom'), 
('name_45','A',45,'tom'), 
('name_47','A',47,'mike'), 
('name_60','A',60,'tom'), 
('name_12','A',12,'tom'), 
('name_70','A',70,'tom'), 
('name_10','B',10,'mike'), 
('name_50','B',50,'tom'), 
('name_51','B',51,'tom');

 

 

2)统计需求

查询各个leader 下 年龄大于40岁的各类员工,按如下表头输出,按年龄从小到大

 

表头:leader,A类员工,B类员工

 

3)脚本

SELECT leader, 
GROUP_CONCAT(IF(`type`='A' AND `age` > 40,`name`,NULL) ORDER BY `age`) as 'A类员工',
GROUP_CONCAT(IF(`type`='B' AND `age` > 40,`name`,NULL) ORDER BY `age`) as 'B类员工'
FROM employee 
GROUP BY leader;

 

4) 结果

 

 

 

三 函数说明

1) 定义:

GROUP_CONCAT ( [DISTINCT] col_name1 [ORDER BY clause]  [SEPARATOR str_val] ) 

 

2)说明:

用于行转列,依赖group by分组,可以配合IF函数进行条件拼接

  • Dinstinct: 指定是否排重
  • Order By: 指定排序字段
  • Separator: 指定分隔符,默认逗号

3)关于拼接长度限制: 

GROUP_CONCAT 通过 group_concat_max_len 变量 设置了 拼接的长度限制,超过最大显示会被截断,可以通过修改该变量保证不被截断

 

查看长度限制 :show variables like 'group_concat_max_len';

 

修改:

SET GLOBAL group_concat_max_len = 102400;

SET SESSION group_concat_max_len = 102400; 

  

或者 设置 group_concat_max_len = -1 指定最大

 

 

  • 大小: 53.8 KB
  • 大小: 36.1 KB
分享到:
评论

相关推荐

    MySQL GROUP_CONCAT限制解决方案

     GROUP_CONCAT函数可以拼接某个字段值成字符串,默认的分隔符是 逗号,即”,” ,  如果需要自定义分隔符可以使用 SEPARATOR  如: SELECT GROUP_CONCAT(name SEPARATOR '_') FROM user 限制:  GROUP_CONCAT...

    MySQL统计函数GROUP_CONCAT使用陷阱分析

    本文实例分析了MySQL统计函数GROUP_CONCAT使用中的陷阱。分享给大家供大家参考,具体如下: 最近在用MySQL做一些数据的预处理,经常会用到group_concat函数,比如类似下面一条语句 代码如下:mysql>select aid,group...

    Mysql的GROUP_CONCAT()函数使用方法

    语法: GROUP_CONCAT([DISTINCT] expr [,expr …][ORDER BY {unsigned_integer | col_name | expr}[ASC | DESC] [,col_name …]][SEPARATOR str_val]) 下面演示一下这个函数,先建立一个学生选课表...

    mysql的group_concat函数使用示例

    MySQL中group_concat函数,完整的语法如下: 代码如下:group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator ‘分隔符’]) 基本查询 代码如下:select * from aa; 代码如下:+——+——+|...

    SqlServer GroupConcat

    SQLServer GroupConcat 的CLR实现,和Oracle 的 GroupConcat相同

    MySQL中group_concat函数深入理解

    本文通过实例介绍了MySQL中的group_concat函数的使用方法,比如select group_concat(name) 。 MySQL中group_concat函数 完整的语法如下: group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] ...

    mysql中GROUP_CONCAT的使用方法实例分析

    本文实例讲述了mysql中GROUP_CONCAT的使用方法。分享给大家供大家参考,具体如下: 现在有三个表,结构如下: cate表: CREATE TABLE `cate` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', `...

    浅谈MySQL中group_concat()函数的排序方法

    group_concat()函数的参数是可以直接使用order by排序的。666。。 下面通过例子来说明,首先看下面的t1表。 比如,我们要查看每个人的多个分数,将该人对应的多个分数显示在一起,分数要从高到底排序。 可以这样写...

    MySQL基于group_concat()函数合并多行数据

     通俗点理解,其实是这样的:group_concat()会计算哪些行属于同一组,将属于同一组的列合并显示出来。要返回哪些列,由函数参数(就是字段名)决定。分组必须有个标准,就是根据group by指定的列进行分组。  合并的...

    mysql如何实现多行查询结果合并成一行

    利用函数:group_concat(),实现一个ID对应多个名称时,原本为多行数据,把名称合并成一行。 其完整语法: GROUP_CONCAT(expr) 该函数返回带有来自一个组的连接的非NULL值的字符串结果。其完整的语法如下所示: GROUP...

    mysql如何将多行数据合并成一行

    您可能感兴趣的文章:MySql采用GROUP_CONCAT合并多条数据显示的方法mysql利用group_concat()合并多行数据到一行mysql如何实现多行查询结果合并成一行关于mysql合并表的详细介绍mysql中合并两个字段的方法分享mysql...

    sybase数据库多行合并为一行多列.sql

    sybase数据库是不支持group_concat函数的,此文件为sybase存储过程样例,可以将多行信息按标识合并为一行多列。

    mysql利用group_concat()合并多行数据到一行

    同时获取存储在b表中的name信息,按照常规查询,b表中有多少记录,则会显示多少行,如果需要只显示a表记录行数,则需要把查询name字段得到的多行记录进行合并,可以通过程序实现,但也可直接在sql层完成。...

    MySQL拼接字符串函数GROUP_CONCAT详解

    要将结果集中某个指定的列进行字符串拼接,这要怎么做呢?主角闪亮:sparkles:登场 GROUP_CONCAT(expr) 在 Mysql 官方文档 中,该函数被放在聚合函数章节,如果你要按照指定字段分组拼接,就要配合关键字 GRO

    行转列sql_server

    sql server 用于行转列,省得各位去找语句,select to_char(wm_concat('''' || valuelabel || '''')) name from (select distinct t.valuelabel from structuredrecruit t) select * from (select t.uhid, t....

    优化sql的测试数据

    优化sql的数据。 select * from (select PI.ID AS ProductID,PI.SynapsID,PI.NameCode,PI.Name_cn,PI.Name_en,PP.PicName,PI.BarCode, PI.NewLevel,PI.`Status`,PI.HighPrice,CPM.SalesPlaceID, psi.WIID,psi....

    MySql采用GROUP_CONCAT合并多条数据显示的方法

    本文实例讲述了MySql采用GROUP_CONCAT合并多条数据显示的方法,分享给大家供大家参考。具体实现方法如下: 假设有这样一个需求: 1:班级表: id class_name 2:学生表: id name class_id   如果我们要查所有的班级...

    Mysql5.7中使用group concat函数数据被截断的问题完美解决方法

    前天在生产环境中遇到一个问题:使用 GROUP_CONCAT 函数select出来的数据被截断了,最长长度不超过1024字节,开始还以为是navicat客户端自身对字段长度做了限制的问题。后面故意重新INSERT了一个字段长度超1024字节...

    MySQL中将一列以逗号分隔的值行转列的实现

    前言 有时会遇到没有遵守第一范式设计模式的业务表。即一列中存储了多个属性值。如下表 pk value ...SQL如下: ...select distinct(substring_index(substring_index(a.col,',',b.help_topic_id... (select group_concat

    MySQL中查询所有数据库占用磁盘空间大小和单个库中所有表的大小的sql语句

    select TABLE_SCHEMA, concat(truncate(sum(data_length)/1024/1024,2),’ MB’) as data_size,concat(truncate(sum(index_length)/1024/1024,2),’MB’) as index_sizefrom information_schema.tablesgroup by ...

Global site tag (gtag.js) - Google Analytics