同学们在使用mysql的过程中,会遇到一个行转列的问题,就是把多条数据转化成一条数据 用多列显示。

方法1. 实现方式用下面的存储过程,表名对应的修改就行。

BEGIN
declare current integer;
declare strValue tinytext ;
declare sqlValue BLOB;
declare columnCount int(4);
declare countNum INTEGER;
declare pageNumber INTEGER;
declare firstNumber integer;
set current = 0;
set countNum=0;
set columnCount=0;
set pageNumber=0;
set firstNumber=0;
drop table if exists personal_contact_temp;
CREATE TABLE `personal_contact_temp` (
`id` varchar(64) NOT NULL COMMENT '主键',
`personal_id` varchar(64) ,
`relation` int(4) ,
`name` TEXT ,
`phone` TEXT ,
`phone_status` int(4) ,
`mobile` TEXT ,
PRIMARY KEY (`id`)
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8 DEFAULT CHARSET=utf8 COMMENT='客户信息联系人临时表';

set columnCount=(select max(conNum) from (select count(*) as conNum from personal_contact GROUP BY personal_id) b);
set current =(select count(*) from (select count(*) as countNum from personal_contact GROUP BY personal_id) b);
while columnCount>0 do
begin
set sqlValue='';
set sqlValue= CONCAT('alter TABLE personal_contact_temp add COLUMN relation',columnCount,'A',' INT(4),',
'add COLUMN name',columnCount,'A',' VARCHAR(255),',
'add COLUMN phone',columnCount,'A',' varchar(255),',
'add COLUMN phone_status',columnCount,'A',' int(4),',
'add COLUMN mobile',columnCount,'A',' VARCHAR(255)',';');
set @ms=sqlValue;
PREPARE stmt1 FROM @ms;
EXECUTE stmt1;
END;
set columnCount=columnCount-1;
end WHILE;

while current>0 do
set pageNumber=current-1;
set strValue = (select personal_id from personal_contact group by personal_id limit pageNumber,1);
set countNum =(select count(*) from personal_contact where personal_id =strValue);
set firstNumber=countNum;
if countNum=1 then
insert into personal_contact_temp(id,personal_id,relation,name,phone,phone_status,mobile)
(select uuid(),personal_id,relation,`name`,phone,phone_status,mobile from personal_contact where personal_id =strValue);
ELSE
while countNum>0 do
set pageNumber=countNum-1;
if(firstNumber=countNum) then
insert into personal_contact_temp(id,personal_id,relation,name,phone,phone_status,mobile)
(select uuid(),personal_id,relation,`name`,phone,phone_status,mobile from personal_contact where personal_id =strValue LIMIT pageNumber,1);
ELSE
BEGIN
set sqlValue='';
set sqlValue= CONCAT('update personal_contact_temp a left join
(select relation,`name`,phone,phone_status,mobile,personal_id from personal_contact where personal_id =',"'",strValue,"'",' limit ',pageNumber,',1) b
on a.personal_id =b.personal_id
set a.relation',countNum,'A','=b.relation,
a.name',countNum,'A','=b.`name`,
a.phone',countNum,'A','=b.phone,
a.phone_status',countNum,'A','=b.phone_status,
a.mobile',countNum,'A','=b.mobile where a.personal_id =',"'",strValue,"'",';');
set @ms=sqlValue;
PREPARE stmt1 FROM @ms;
EXECUTE stmt1;
end;
end if;
set countNum =countNum-1;
end WHILE;
end if;
set current=current-1;
end WHILE;
END;

注意 这个存储过程在运行的时候回报 列太大的问题,就是如果多行数据展示到一行,会超出 mysql 行数据的最大值。 这个可以酌情处理。

方法2. Mysql 提供了 group_concat 函数

select GROUP_CONCAT(`name`,'"',',',relation,'"',',',phone) from personal_contact GROUP BY personal_id;

通过这个函数可以将你要查询的数据放到一个列中,然后到处CSV格式的数据,将后面这一列的数据转化成CSV格式的数据,然后存成CSV导入到数据库中。

欢迎大家提出更多解决方案。

MySql 行转列 存储过程实现的更多相关文章

  1. MySQL 行转列 -》动态行转列 -》动态行转列带计算

    Pivot Table Using MySQL - A Complete Guide | WebDevZoomhttp://webdevzoom.com/pivot-table-using-mysql ...

  2. MYSQL 行转列 以及基本的聚合函数count,与group by 以及distinct组合使用

    在统计查询中,经常会用到count函数,这里是基础的 MYSQL 行转列 以及基本的聚合函数count,与group by 以及distinct组合使用 -- 创建表 CREATE TABLE `tb ...

  3. mysql行转列,列转行

    行转列,列转行是我们在开发过程中经常碰到的问题.行转列一般通过CASE WHEN 语句来实现,也可以通过 SQL SERVER 2005 新增的运算符PIVOT来实现.用传统的方法,比较好理解.层次清 ...

  4. mysql行转列,函数GROUP_CONCAT(expr)

    demo: 语句: SELECT '行' id, '' product_nameUNIONSELECT id, product_name FROM `product` WHERE id < 5 ...

  5. mysql行转列 问题 SUM(IF(条件,列值,0))

    sum(if(条件,列值,0))语法用例: select name,sum(if(subject="语文",score,0)) as "语文" from gra ...

  6. mysql行转列、列转行示例

    最近在开发过程中遇到问题,需要将数据库中一张表信息进行行转列操作,再将每列(即每个字段)作为与其他表进行联表查询的字段进行显示. 借此机会,在网上查阅了相关方法,现总结出一种比较简单易懂的方法备用. ...

  7. MySQL行转列、列转行

    一.行转列 有如图所示的表,现在希望查询的结果将行转成列 建表语句如下: CREATE TABLE `TEST_TB_GRADE` ( `ID` int(10) NOT NULL AUTO_INCRE ...

  8. mysql 行转列 列转行

    一.行转列 即将原本同一列下多行的不同内容作为多个字段,输出对应内容. 建表语句 DROP TABLE IF EXISTS tb_score; CREATE TABLE tb_score( id ) ...

  9. MySQL行转列与列转行

    行转列 例如:把图1转换成图2结果展示 图1 图2 CREATE TABLE `TEST_TB_GRADE` ( `ID` ) NOT NULL AUTO_INCREMENT, `) DEFAULT ...

随机推荐

  1. 免安装版本tomcat 指定的服务并未以已安装的服务存在,Unable to open the service

    今天在自己的电脑上安装了Tomcat6.0.14,是在Tomcat主页上直接下载的免安装版.但是把文件解压的之后,双击Tomcat6w.exe时,去出现了"指定的服务并未以已安装的服务存在, ...

  2. findViewById中NullPointerException的错误

    最近在弄一个对话框的登录时,发现一个总是报NullPointerException的错误,折腾了两小时,一直没有发现细小的区别..先上图,一边说明原因 首先是 Activity类中定义的findVie ...

  3. android打包方法超过65k错误

    近日,Android Developers在Google+上宣布了新的Multidex支持库,为方法总数超过65K的Android应用提供了官方支持. 如果你是一名幸运的Android应用开发者,正在 ...

  4. pig中查询top k,返回每个hour和ad_network_id下最大两个记录(SUBSTRING,order,COUNT_STAR,limit)

    pig里面是有TOP函数,不知道为什么用不了.有时间要去看看pig源码了. SET job.name 'top_k'; SET job.priority HIGH; --REGISTER piggyb ...

  5. Android进阶(十一)Android系统架构讲解

    如果说一个成功男人的背后会有一个默默支持的女人的话,那么一个优越稳定的平台背后必有一个成熟的系统架构所支撑着.那么,Android的系统架构是怎么样的呢?从下图我们可以从整体上有个大致的了解(图片来源 ...

  6. Oracle中使用游标获取指定数据表的所有字段名对应的字符串

    操作步骤:打开PLSQL Developer后,直接执行下面的语句就可以出来 --Oracle中使用游标获取指定数据表的所有字段名对应的字符串 declare mytablename VARCHAR( ...

  7. Linux/Android多点触摸协议

    链接点击打开链接 关于Linux多点触摸协议大家可以参考kernel中的文档:https://www.kernel.org/doc/Documentation/input/multi-touch-pr ...

  8. 9.5、Libgdx加速度计

    (官网:www.libgdx.cn) 加速度计可以让设备通过三个坐标轴检测加速度.通过加速度可以检测设备的方向. 加速度的单位是米每秒的平方.如果一个坐标轴指向地心,加速度大概是-10米每秒的平方.如 ...

  9. (四十二)tableView的滑动编辑和刷新 -局部刷新和删除刷新 -待解决问题

    tableView的局部刷新有两个方法: 注意这个方法只能用于模型数据的行数不变,否则会出错. [self.tableView reloadRowsAtIndexPaths:<#(NSArray ...

  10. Spring揭秘读书笔记 八 数据访问异常体系

    这篇博客 来自spring揭秘一书的第十三章 为什么要有访问异常都有一个体系,这个我们得从DAO模式说起. DAO模式 任何一个系统,不管是一个最简单的小系统,还是大规模的系统,都得跟数据打交道,说白 ...