如何更新某列使之成为序列

grayhoundd 2008-04-08 03:14:11
有表如下
id sn name
GUID 小黑
GUID 小白
GUID 小花
....

是一个班级的学生表。sn内容为空,如何更新sn列,并使之成为01,02等序号,并且按name排序
id sn name
GUID 01 小白
GUID 02 小黑
GUID 03 小花
....
...全文
139 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
yyyyzzzz_2002 2008-04-08
  • 打赏
  • 举报
回复

/*id sn name
GUID 小黑
GUID 小白
GUID 小花
....

是一个班级的学生表。sn内容为空,如何更新sn列,并使之成为01,02等序号,并且按name排序
id sn name
GUID 01 小白
GUID 02 小黑
GUID 03 小花 */

use tempdb
go
if object_id('tempdb..#') is not null
drop table #

create table #(id varchar(20)
,sn varchar(20)
,name varchar(20))

insert into #
select 'GUID',null,'小白'
union all
select 'GUID',null,'小黑'
union all
select 'GUID',null,'小花'


select * from #

select id
,'0'+cast(row_number() over(partition by id order by id) as varchar(10)) as sn
,name
from #
order by name
wlinglong 2008-04-08
  • 打赏
  • 举报
回复
delcare @i int
Select @i = 1
update tab
Set tab.i = @i , @i = @i + 1
wynlc 2008-04-08
  • 打赏
  • 举报
回复
declare @tb table (sn varchar(10),name varchar(10))
insert into @tb select '','小黑'
insert into @tb select '','小白'
insert into @tb select '','小花'

select count(1) from @tb

update tp set sn=right('00'+ltrim((select count(1) from @tb where name<=tp.name)),3)from @tb tp

select * from @tb order by name

学习
wzy_love_sly 2008-04-08
  • 打赏
  • 举报
回复


update tp set sn=right('000'+ltrim((select count(1) from @tb where name<=tp.name)),3)from @tb tp

自己控制 '0000'的个数和 right(,个数)
grayhoundd 2008-04-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 libin_ftsafe 的回复:]
SQL codeupdate表 tsetsn=right('0'+rtrim((selectcount(*)from表wherename<=t.name)),2)
[/Quote]

有语法错误啊
消息 102,级别 15,状态 1,第 1 行
't' 附近有语法错误。
消息 102,级别 15,状态 1,第 1 行
',' 附近有语法错误。
grayhoundd 2008-04-08
  • 打赏
  • 举报
回复
还有,如果超过一百,以上朋友的方法就不对了

01
...
19
...
99
...
101
..
999
...
7865

如果位数少于2,以2位显示,否则正常显示
chenxin2835 2008-04-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 libin_ftsafe 的回复:]
SQL codeupdate 表 t set sn=right('0'+rtrim((select count(*) from 表 where name<=t.name)),2)
[/Quote]
学习了,很快,很精简
grayhoundd 2008-04-08
  • 打赏
  • 举报
回复
按姓名的拼音编序
grayhoundd 2008-04-08
  • 打赏
  • 举报
回复
ojuju10 的结果全是01, id是主键,GUID是32位字符串

其他人的似乎可以,后来发现,不支持中文姓名的排序
ojuju10 2008-04-08
  • 打赏
  • 举报
回复

--2005
CREATE TABLE tb(id VARCHAR(20),sn VARCHAR(10),name VARCHAR(10))
GO
INSERT tb SELECT 'GUID',NULL , '小黑'
UNION ALL SELECT 'GUID',NULL , '小白'
UNION ALL SELECT 'GUID',NULL, '小花'

update a set sn=b.snum from tb a,(select id,name, snum=right('00'+ltrim(row_number() over (Partition by id order by name)),2) from tb ) b
where a.id=b.id and a.name=b.name

select * from tb
order by sn

id sn name
-------------------- ---------- ----------
GUID 01 小白
GUID 02 小黑
GUID 03 小花

(3 行受影响)

fcuandy 2008-04-08
  • 打赏
  • 举报
回复
CREATE TABLE tb(id VARCHAR(20),sn VARCHAR(10),name VARCHAR(10))
GO
INSERT tb SELECT 'GUID',NULL , '小黑'
UNION ALL SELECT 'GUID',NULL , '小白'
UNION ALL SELECT 'GUID',NULL, '小花'
GO

UPDATE a SET sn=RIGHT('00' + RTRIM((SELECT COUNT(*) FROM tb WHERE name < = a.name)),2) FROM tb a
SELECT * FROM tb ORDER BY name

GO

DROP TABLE tb
GO
wzy_love_sly 2008-04-08
  • 打赏
  • 举报
回复
declare @tb table (sn varchar(10),name varchar(10))
insert into @tb select '','小黑'
insert into @tb select '','小白'
insert into @tb select '','小花'

update tp set sn=right('000'+ltrim((select count(1) from @tb where name<=tp.name)),3)from @tb tp

select * from @tb order by name


sn name
001 小白
002 小黑
003 小花
zarge 2008-04-08
  • 打赏
  • 举报
回复
update table
set sn = ( select count(*) from table where name <= t.name )
from table t
昵称被占用了 2008-04-08
  • 打赏
  • 举报
回复
update a
set sn=right('00'+cast((select count(1) from tab where name<=a.name) as varchar),2)
from tab a
子陌红尘 2008-04-08
  • 打赏
  • 举报
回复
update 表 t set sn=right('0'+rtrim((select count(*) from 表 where name<=t.name)),2)

34,838

社区成员

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

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