序号的怎样可以自动生成,不要用游标.

JerryOne 2005-01-08 11:32:23
如题:
Test
出货单名 序号 制令单号 制令序号
001 1 0000001 1
001 1 0000001 1
001 1 0000002 1
001 1 0000002 1
002 1 0000001 1
002 1 0000001 1
002 1 0000002 1
002 1 0000002 1

怎样变成以下格式,请不要用游标,我的数据量很大

出货单名 序号 制令单号 制令序号
001 1 0000001 1
001 2 0000001 2
001 3 0000002 1
001 4 0000002 2
002 1 0000003 1
002 2 0000003 2
002 3 0000004 1
002 4 0000004 2
...全文
239 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
skywebnet 2005-01-08
  • 打赏
  • 举报
回复
看错了 ,不过改动以下就可以用了 , 要下了
skywebnet 2005-01-08
  • 打赏
  • 举报
回复
declare @id int
set @id=0
update test set 序号=@id , @Id=@id+1
xluzhong 2005-01-08
  • 打赏
  • 举报
回复
帮你顶!
JerryOne 2005-01-08
  • 打赏
  • 举报
回复
谢谢didoleo(冷月无声),Softlee81307(孔腎) ,wyb0026(小小)
结贴了
JerryOne 2005-01-08
  • 打赏
  • 举报
回复
用didoleo(冷月无声) 的可以,不过还要转换.谢谢了
didoleo 2005-01-08
  • 打赏
  • 举报
回复
001 1 0000001 1
001 2 0000001 2
001 3 0000002 1
001 4 0000002 2
002 1 0000003 1
002 2 0000003 2
002 3 0000004 1
002 4 0000004 2


(所影响的行数为 8 行)
didoleo 2005-01-08
  • 打赏
  • 举报
回复
--谢谢TO Softlee81307(孔腎) 的启发,帮你改一下
Declare @i int
Declare @j int
Declare @k varchar(3)
Declare @m varchar(7)
set @k=''
set @m=''
set @i=0
set @j=0
update tek set sno=@i,@i=(case when @k<>outno then 1 else @i+1 end),@k=outno,
zco=@j,@j=(case when @m<>zno then 1 else @j+1 end),@m=zno
from tek
JerryOne 2005-01-08
  • 打赏
  • 举报
回复
TO Softlee81307(孔腎) :
我想要的就是你这种方式,不过我测试你的脚本,发现还有序号没有生成正确的
Softlee81307 2005-01-08
  • 打赏
  • 举报
回复
見樓主把上面全文copy到sql中直接執行便可
-----------------------------------------
經測試過
Softlee81307 2005-01-08
  • 打赏
  • 举报
回复
隻需要一條語句可實現
見下面
Create TABLE Tek (
OutNo Varchar(3),
SNo Int,
Zno varchar(7),
zco int
)
insert into tek values( '001' , 1, '0000001', 1 )
insert into tek values( '001', 1, '0000001', 1)
insert into tek values( '001', 1, '0000002', 1)
insert into tek values( '001', 1, '0000002', 1)
insert into tek values( '002', 1, '0000001', 1)
insert into tek values( '002', 1, '0000001', 1)
insert into tek values( '002', 1, '0000002', 1)
insert into tek values( '002', 1, '0000002', 1)

select * from tek
------------------------創表並列表數據---------------
Declare @i int
Declare @k varchar(3)
set @k=''
set @i=0
update tek set sno=@i,@i=(case when @k<>outno then 1 else @i+1 end),@k=outno from tek
-------------這段update 是實現的語句-----------------


didoleo 2005-01-08
  • 打赏
  • 举报
回复
create table Test
(
出货单名 varchar(3),
序号 int,
制令单号 varchar(7),
制令序号 int
)

insert into Test
select '001' , 1 , '0000001' , 1 union all
select '001' , 1 , '0000001' , 1 union all
select '001' , 1 , '0000002' , 1 union all
select '001' , 1 , '0000002' , 1 union all
select '002' , 1 , '0000001' , 1 union all
select '002' , 1 , '0000001' , 1 union all
select '002' , 1 , '0000002' , 1 union all
select '002' , 1 , '0000002' , 1



select identity(int) as newidd,* into #Test from Test



update #Test set
序号=(select count(1) from #Test where 出货单名=a.出货单名 and newidd<=a.newidd) from #Test a

update #Test set
制令序号=(select count(1) from #Test where 出货单名=a.出货单名 and 制令单号=a.制令单号 and newidd<=a.newidd
) from #Test a

truncate table Test
insert into Test
select 出货单名,序号,制令单号,制令序号 from #test


select * from Test

001 1 0000001 1
001 2 0000001 2
001 3 0000002 1
001 4 0000002 2
002 1 0000003 1
002 2 0000003 2
002 3 0000004 1
002 4 0000004 2


(所影响的行数为 8 行)

JerryOne 2005-01-08
  • 打赏
  • 举报
回复
谢谢小小,我测试一下
wyb0026 2005-01-08
  • 打赏
  • 举报
回复
制令序号我暂时没时间
wyb0026 2005-01-08
  • 打赏
  • 举报
回复
我完成了 "序号" 的更改
是这样做的
首先添加自增列k(干完活要删除)

update test set 序号=w from
test inner join
(select a.k,count(*) w from Test a full join Test b on a.k>=b.k group by a.k) as t
on test.k=t.k
didoleo 2005-01-08
  • 打赏
  • 举报
回复
晕,看错了.
didoleo 2005-01-08
  • 打赏
  • 举报
回复
把表的序号改成 identity

34,588

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧