`
kane82
  • 浏览: 25379 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

Mysql存储过程-行列转换

阅读更多
在网上找了些资料,自己动手写了个行列转换的存储过程。
下面片段为表结构:
CREATE TABLE `changeprice` (
  `id` bigint(20) NOT NULL auto_increment,
  `sid` bigint(20) NOT NULL,
  `datecreated` Date NOT NULL default CURRENT_TIMESTAMP,
  `price` varchar(50) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

表中插入以下数据:
(1,1,'2009-05-08','30'),
(2,1,'2009-05-10','50'),
(3,1,'2009-05-11','12'),
(4,1,'2009-05-12','20'),
(5,1,'2009-05-14','50'),
(6,1,'2009-05-15','30'),
(7,3,'2009-05-11','12'),
(8,3,'2009-05-12','30'),
(9,3,'2009-05-14','50'),
(10,3,'2009-05-15','30'),
(11,2,'2009-05-08','30'),
(12,2,'2009-05-09','50'),
(13,2,'2009-05-11','12'),
(14,2,'2009-05-13','20'),
(15,2,'2009-05-14','50'),
(16,2,'2009-05-15','30');
现要显示为:
sid,5-8,5-9,5-10,5-11,5-12...
1, 30, 0,  50,12, 20 ...
2, 30, 50, 0, 12, 0 ...
3, 0,  0,  0,  0, 12 ...
采用mysql存储过程加上cursor实现。
create procedure test111()
begin
         DECLARE done int default 0;
         DECLARE strDate DATE;
         DECLARE str CHAR(1000) default '';
	DECLARE cur1 CURSOR FOR select DISTINCT(DATE(datecreated)) from changeprice order by datecreated;
         DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;
         open cur1;
         REPEAT
         if not done then
         FETCH cur1 INTO strDate;
         set str=CONCAT(str, ',', 'SUM(if(datecreated=''', strDate, ''', price, 0))', '''', strDate,'''');
         end IF;
         UNTIL done END REPEAT;
         set @sqlString=CONCAT(' select sid ', str, ' from changeprice group by sid ');
         prepare sqlstmt from @sqlString;
         execute sqlstmt;
         deallocate prepare sqlstmt;

end
分享到:
评论
2 楼 openopenjava 2012-06-20  
后面总是加一列是怎么回事?
1 楼 winner720 2009-09-15  
真是太感谢你了,你这个对我有很大的帮助。

相关推荐

    mysql动态行转列

    MySQL 动态行转列是指将数据库中的一行数据转换为多列数据的过程。在本示例中,我们将创建一个存储过程来实现动态行转列,用于从数据库中提取指定学生的成绩信息。 描述解释 MySQL 数据库中存在一个问题,即如何将...

    MySql 列转行实例

    在MySQL中,我们可以创建自定义的存储过程来执行复杂的数据处理任务,比如行列转换。 对于"列转行",一个常见的应用场景是处理交叉表(也称作透视表)。交叉表允许我们将数据按照多个维度进行展示,比如在一个销售...

    mysql 行列动态转换的实现(列联表,交叉表)

    在MySQL中,行列转换是一种常见的数据处理需求,特别是在数据分析和报表生成时。列联表(Cross Tabulation)和交叉表(Pivot Table)是这种转换的两种术语,它们用于将行数据转换为列数据,或者反之。在描述的场景中...

    poi解析jsp上传的excel文件并导入mysql(支持xls和xlsx)优化版

    【标题】"poi解析jsp上传的excel文件并导入mysql(支持xls和xlsx)优化版"主要涉及了两个关键技术和一个优化点。首先,POI是Apache软件基金会的Java API,用于处理Microsoft Office格式的文件,如Excel。在这个场景...

    Mysql数据库学习

    **1.4 MySQL表的行列说明** - **行:** 表中的每一行代表一条完整的记录。 - **列:** 每一列代表数据的一个属性,例如姓名、年龄等。 - **主键:** 一个表可以有一个或多个主键,用于唯一标识每条记录。 **1.5 ...

    MYSQL培训经典教程(共两部分) 1/2

    MYSQL高级特性 81 4.1 集合函数 82 4.1.1 行列计数 82 4.1.2统计字段值的数目 82 4.1.3 计算字段的平均值 83 4.1.4 计算字段值的和 84 4.1.5 计算字段值的极值 84 4.1.6 总结 86 4.2 操作...

    sql表数据行列互换

    在数据库管理与数据分析领域,有时我们需要对表格中的数据进行特殊的处理,例如将行转换为列或将列转换为行,这样的操作被称为“行列互换”。这种需求通常出现在汇总报告、数据透视等场景下。本文将详细介绍如何在...

    sql.rar_SQL 脚本

    "sql.rar_SQL 脚本"这个压缩包文件显然是一个关于SQL脚本的资源,其中包含了"sql.txt"这样一个文本文件,很可能存储了关于行列转换的具体示例或者解决方案。 在SQL中,行列转换通常是为了适应不同的数据展示需求,...

    实际工作中常用sql积累及总结

    本篇文章将针对"实际工作中常用sql积累及总结"进行深入探讨,涵盖事务处理、游标、存储过程、行列转换、递归查询、数据库备份与还原、分布式查询、批量更新、合并记录以及动态SQL等多个关键知识点。 1. **事务处理*...

    Mysql的列修改成行并显示数据的简单实现

    在MySQL中,有时候我们需要将原本存储为列的数据转换为行的形式进行展示,这种操作被称为“行列转换”或“Pivot”。在本示例中,我们将详细介绍如何通过SQL语句实现这个功能,特别是在处理时间序列数据时,如按年份...

    MYSQL培训经典教程(共两部分) 2/2

    MYSQL高级特性 81 4.1 集合函数 82 4.1.1 行列计数 82 4.1.2统计字段值的数目 82 4.1.3 计算字段的平均值 83 4.1.4 计算字段值的和 84 4.1.5 计算字段值的极值 84 4.1.6 总结 86 4.2 操作...

    SQL操作技巧,个人心得

    以上就是对SQL操作技巧的一些详细解读,包括全局变量的使用、数据交换的方法、存储过程实现翻页、行列转换的技巧、视图的创建以及分页和删除重复数据的策略。熟练掌握这些知识点,对于日常的SQL编程和数据库管理都将...

    cmd操作命令和linux命令大全收集

    tlist -t 以树行列表显示进程(为系统的附加工具,默认是没有安装的,在安装目录的Support/tools文件夹内) kill -F 进程名 加-F参数后强制结束某进程(为系统的附加工具,默认是没有安装的,在安装目录的Support/...

    mysql 将列值转变为列的方法

    在SQL中,将列值转变为列的操作通常被称为“PIVOT”操作,或者称为行列转换。这个过程可以将数据表中的行数据转换为列数据,从而使得数据分析更加方便。在MySQL中,由于不直接支持PIVOT函数,我们需要通过一些技巧来...

    2021-2022计算机二级等级考试试题及答案No.12645.docx

    - **详细解释:** 触发器是MySQL中的一种特殊存储过程,可以在特定的操作(如插入、更新或删除数据)发生时自动执行。在INSERT触发器中,NEW关键字代表即将被插入的新行数据,而OLD关键字则不适用于INSERT触发器。 #...

    oracle精品教程

    在实际应用中,SQL的使用非常广泛,其中包括行列转换、分页和树状结构数据操作。行列转换多用于生成报表;分页技术则常用于从大量数据中抽取部分内容显示,提高用户界面的响应速度;树状结构的数据操作则常见于处理...

    大数据面试宝典2023整理

    行列转换是指将数据库表中的行转换为列,或者将列转换为行。行转列可以用于将多行数据合并成一行,列转行可以用于将一行数据拆分成多行。 分组后的 TOP N 分组后的 TOP N 是指在分组后的结果集中选取前 N 条记录。...

    经典SQL脚本大全

    │ │ 7.2.4 使用系统存储过程实现的通用分页存储过程.sql │ │ 7.3.1 实现随机分页的通用分页存储过程.sql │ │ 7.3.2 根据分类表实现的分页存储过程.sql │ │ │ └─其他 │ sp_cursor.sql │ 基本方法.sql ...

    FastReport自带例子

    - FastReport支持多种数据源,包括数据库(如SQL Server、MySQL、Oracle等)、XML文件、Excel文件以及自定义的数据提供者。 - 示例中可能包含如何配置数据源,连接数据库,并将数据绑定到报表的步骤。 3. **脚本...

Global site tag (gtag.js) - Google Analytics