同学们在使用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. javascript之类型转换

    JavaScript是一种无类型语言,但同时JavaScript提供了一种灵活的自动类型转换的处理方式.基本规则是,如果某个类型的值用于需要其他类型的值的环境中,JavaScript就自动将这个值转换 ...

  2. JQuery之事件处理

    JQuery不支持捕获模型 冒泡模型解析 <body> <div> <input id="bntShow" type="button&quo ...

  3. 06_NoSQL数据库之Redis数据库:Redis的高级应用之登录授权和主从复制

     Redis高级实用特征 安全性(登录授权和登录后使用auth授权) 设置客户端连接后进行任何其他指定前需要使用的密码. 警告:因为redis速度相当快,所以在一台比较好的服务器下,一个外部的用户 ...

  4. Java中函数的递归调用

    说到递归,java中的递归和C语言中也是很相似的,在Java中,递归其实就是利用了栈的先进后出的机制来描述的. public class HelloWorld { public static void ...

  5. 图文浅析APK程序运行的过程

    概述 APK程序运行过程有别于FrameWork底层启动过程,它们是倆码事,本文将以图文方式总结一下APK启动的过程,主要分为一下部分 [1]基本概念 [2]APK过程 1 .新的知识点 [1]什么是 ...

  6. Android 实现Json数据解析,并进行应用!

    从网站上获取数据然后再客户端进行解析是常见的数据交互.下面是常用的一些接口网址: webservice工厂接口 http://www.36wu.com 快递查询接口http://webservice. ...

  7. Java由先序序列和中序序列还原二叉树

    还原本来的二叉树并不是一个非常简单的事,虽然思想比较简单,但过程却是比较繁琐.下面我拿先序序列和中序序列来讲一下原理吧. 从先序序列中我们一下子就可以得到二叉树的根节点是第一个元素,然后再中序序列中我 ...

  8. iOS中 SDWebImage手动清除缓存的方法 技术分享

    1.找到SDImageCache类 2.添加如下方法: - (float)checkTmpSize { float totalSize = 0; NSDirectoryEnumerator *file ...

  9. 【leetcode74】Sum of Two Integers(不用+,-求两数之和)

    题目描述: 不用+,-求两个数的和 原文描述: Calculate the sum of two integers a and b, but you are not allowed to use th ...

  10. naoting

    生活就像一锅菠菜汤 20160714 夜