您的位置:首页 > 数据库 > MySQL

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

2008-07-30 09:54 423 查看
好像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)、游标实现

[code]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();[/code]

query result(7 records)

depval1num
办公室161
办公室122
市场部261
市场部252
市场部243
研发部191
研发部112

uery result(7 records)

depval1num
办公室161
办公室122
市场部261
市场部252
市场部243
研发部191
研发部112
(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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: