`
saybody
  • 浏览: 869499 次
  • 性别: Icon_minigender_2
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论

关于分组序号在MySQL中的实现

阅读更多
好像ORACLE中有相应的函数,可惜在MSSQL 或者MySQL中没有对应的函数。后两者就得用临时表来实现了。

1、表结构以及示例数据。

create table company
(dep char(10) not null,
val1 int unsigned not null
);
insert into company values
(
'市场部', 26),
('市场部',25),
('市场部',24),
('办公室',16),
('办公室',12),
('研发部',19),
('研发部'
,11);

2、存储过程

1)、循环实现

DELIMITER $$

CREATE DEFINER=`root`@`%` PROCEDURE `sp_generate_auto`()
BEGIN
declare cnt int default 0;
declare i int default 0;
drop table if exists tmp;
-- Temporary table to save the result.
create temporary table tmp like company;
alter table tmp add num int unsigned not null;
select count(1) as total from (select count(1) from company where 1 group by dep) T into cnt;
while i < cnt
do
set @stmt = concat('select dep from company where 1 group by dep order by dep asc limit ',i,',1 into @t_dep');
prepare s1 from @stmt;
execute s1;
deallocate prepare s1;
set @stmt = NULL;
set @num = 0;
set @stmt2 = concat('insert into tmp select dep,val1,@num := @num + 1 as sequence from company where dep = ''',@t_dep,''' order by dep asc');
prepare s1 from @stmt2;
execute s1;
deallocate prepare s1;
set @stmt2 = NULL;
set i = i + 1;
end while;
select * from tmp;
set @t_dep = NULL;
END$$

DELIMITER ;

2)、游标实现

DELIMITER $$



DROP PROCEDURE IF EXISTS `sp_generate_auto_cursor`$$



CREATE DEFINER=`root`@`%` PROCEDURE `sp_generate_auto_cursor`()

BEGIN

declare done1 int default 0;

declare a char(10);

declare i int unsigned default 0;
-- Cursor one to get the group total
declare cur1 cursor for select dep from company group by dep;

declare continue handler for 1329 set done1 = 1;

-- Temporary table to save the result.

drop table if exists tmp;

create table tmp like company;

alter table tmp add num int unsigned not null;

open cur1;

while done1 != 1

do

fetch cur1 into a;

if not done1 then

set @i = 0;

begin

declare done2 int default 0;

declare b int unsigned default 0;

declare c int unsigned default 0;
-- Cursor two to get per group total.
declare cur2 cursor for select val1,@i := @i + 1 from company where dep = a;

declare continue handler for 1329 set done2 = 1;

open cur2;

while done2 <> 1

do

fetch cur2 into b,c;

if not done2 then

insert into tmp select a,b,c;

end if;

end while;

close cur2;

end;

end if;

end while;

close cur1;

select * from tmp;

END$$



DELIMITER ;



3、调用结果

call sp_generate_auto();
call sp_generate_auto_cursor();

query result(7 records)

dep val1 num
办公室 16 1
办公室 12 2
市场部 26 1
市场部 25 2
市场部 24 3
研发部 19 1
研发部 11 2

uery result(7 records)

dep val1 num
办公室 16 1
办公室 12 2
市场部 26 1
市场部 25 2
市场部 24 3
研发部 19 1
研发部 11 2
(7 row(s)returned)
(15 ms taken)

(0 row(s)affected)
(0 ms taken)

(7 row(s)returned)
(16 ms taken)

(0 row(s)affected)
(0 ms taken)
分享到:
评论

相关推荐

    PB分组序号

    PB设置分组序号

    js序号递增 前端实现的多种方法

    js序号递增前端实现的多种方法js序号递增前端实现的多种方法js序号递增前端实现的多种方法js序号递增前端实现的多种方法js序号递增前端实现的多种方法js序号递增前端实现的多种方法js序号递增前端实现的多种方法js...

    dataset中自动序号实现

    dataset中的自动序号的实现方法!、

    mysql清除记录数

    1.mysql清空表语句后,新插入的语句会ID会以之前存在的序号记录下去,使用truncate命令清除记录,新插入的语句从1开始 示例: mysql&gt; select id from t1; +----+ | id | +----+ | 1 | | 2 | | 3 | +----+ 清空表 ...

    Mysql取分组后的每组第一条数据

    gruop by 分组后 进行 order by mysql会按照 先分组后排序的形式进行输出 并不能做到每组中的第一条数据取出。 我的思路是 : 先将要查询的数据表转换成已经排序的临时表 在进行 分组操作 。 因为在mysql分组是将第...

    [数据库] MySQL基础知识之日期判断及添加排序序号1

    1.日期类型的判断 2.decode函数的替代方法 3.查询语句中添加一个排序的序号 1.日期类型判断 2.decode取代函数 3.添加排序序号

    C# wpf style中实现ListBox自动生成序号

    在style中生成序号,ListBox中的元素的文本标签只需应用style即可。本资源是文章https://blog.csdn.net/u013113678/article/details/120982077的附件资源,包含完整的代码及vs2019项目。

    MySQL rownumber SQL生成自增长序号使用介绍

    MySQL 几乎模拟了 Oracle,SQL Server等商业数据库的大部分功能,函数。但很可惜,到目前的版本(5.1.33)为止,仍没有实现ROWNUM这个功能

    图书管理系统数据库设计-MYSQL实现(2).docx

    stu_integrity int not null/default=1 学生诚信级 book: 列名 数据类型 是否为空/性质 说明 book_id int not null / PK 唯一书籍序号 book_name varchar not null 书籍名称 图书管理系统数据库设计-MYSQL实现(2)...

    Oracle/MySQL以当前日期加顺番 生成编号

    //生成最大编号 规则为当前日期+6位顺番, //没有记录时,当前日期+000001 //当前日期比从数据库取得的最大日期大时, 当前日期+000001 //当前日期等于从数据库取得最大日期,顺番+1

    在查询中生成序号列

    在查询中生成序号列,构思巧妙。请作者与我联系,以便在这附上您的大名。

    mysql简单实现查询结果添加序列号的方法

    本文实例讲述了mysql简单实现查询结果添加序列号的方法。分享给大家供大家参考,具体如下: 第一种方法: 代码如下:select (@i:=@i+1) as i,table_name.* from table_name,(select @i:=0) as it 第二种方法: set...

    DataSet添加序号列,是显示在第一列的哦

    DataSet添加序号列,是显示在第一列的哦,我现在就用的这个。

    如何在Hive、MySQL、Oracle中分别添加自增序号

    最近公司业务涉及到了在相应库中添加自增序号这种操作,闲暇之余,整理如下,仅供参考~ 一、Hive  1、首先在Hive中建立一个测试表 create table xzw(id int, name string) clustered by (id) into 2 buckets ...

    图书管理系统数据库设计mysql实现-().docx

    说明 book_id int not null / PK 唯一书籍序号 book_name varchar not null 书籍名称 book_author varchar not null 书籍作者 book_pub varchar not null 书籍出版社 book_num int not null 书籍是否在架上 ...

    WPF中给listboxItem加上序号标签

    或许有人遇到了这样的问题,开发listbox时想要给它的item加上序号标签,以标识它们各自的位置,但难以实现,大多数人最后只能够在数据源中加入序号数据。但这样又难以实现序号随时更新。如果移动项,往往会出现乱序...

    自动更新序号.xlsx

    自动更新序号,不用每次插入行,删除行都要填充公式,是excel中回用到的一个常用函数,学习他很有用哦,希望大家能学会,谢谢大家的支持

    C#中datagridview中添加序号和编辑数据同步数据库

    C#中datagridview中添加序号和编辑数据同步本地数据库

    GridControl分组显示明细序号.rar

    GridControl分组之后按组显示明细序号

    mysql数据库my.cnf配置文件

    可以实现单表在不同的数据库中移动。 # 4.空间可以回收(除drop table操作处,表空不能自已回收) # 缺点: # 单表增加过大,如超过100G # 结论: # 共享表空间在Insert操作上少有优势。其它都没独立表空间表现好。...

Global site tag (gtag.js) - Google Analytics