同组自动编码,有一定难度(50分)

vfp_system 2009-12-05 04:13:35
数据如下:
3607250101010001 本人或户主 刘天福 男 1956-12-01
3607250101010001 配偶 黄世珍 女 1960-04-01
3607250101010001 子 刘承平 男 1977-05-01
3607250101010001 女 刘承美 女 1984-02-01
3607250101010001 女 刘先艳 女 2005-12-01
3607250101010001 其他 张蓝 女 1977-10-01

要求的结果如下:
360725010101000101 本人或户主 刘天福 男 1956-12-01
360725010101000102 配偶 黄世珍 女 1960-04-01
360725010101000103 子 刘承平 男 1977-05-01
360725010101000104 女 刘承美 女 1984-02-01
360725010101000105 女 刘先艳 女 2005-12-01
360725010101000106 其他 张蓝 女 1977-10-01

请问如何实现,最好是一条SQL完成。
...全文
86 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
nianran520 2009-12-05
  • 打赏
  • 举报
回复
/*=============================================*/
--> 测试数据:@table
declare @table table([code] varchar(20),[mark] varchar(10),[name] varchar(6),[sex] varchar(2),[date] datetime)
insert @table
select '3607250101010001','本人或户主','刘天福','男','1956-12-01' union all
select '3607250101010001','配偶','黄世珍','女','1960-04-01' union all
select '3607250101010001','子','刘承平','男','1977-05-01' union all
select '3607250101010001','女','刘承美','女','1984-02-01' union all
select '3607250101010001','女','刘先艳','女','2005-12-01' union all
select '3607250101010001','其他','张蓝','女','1977-10-01' union all
select '3607250101010002','本人或户主','刘长生','男','1948-04-01' union all
select '3607250101010002','配偶','申群英','女','1954-07-01' union all
select '3607250101010003','本人或户主','张保龙','男','1962-07-01' union all
select '3607250101010003','配偶','李秀英','女','1962-06-01' union all
select '3607250101010003','父母','蒋桂香','女','1931-01-01' union all
select '3607250101010003','父母','张义祥','男','1916-01-01'


declare @i int
select @i = 0
update t set code = t.code+right('0'+convert(varchar(20),
@i-(select count(1) from @table where code < t.code)),2),
@i = @i + 1
from @table t

select * from @table
-------------------------------
360725010101000101 本人或户主 刘天福 男 1956-12-01 00:00:00.000
360725010101000102 配偶 黄世珍 女 1960-04-01 00:00:00.000
360725010101000103 子 刘承平 男 1977-05-01 00:00:00.000
360725010101000104 女 刘承美 女 1984-02-01 00:00:00.000
360725010101000105 女 刘先艳 女 2005-12-01 00:00:00.000
360725010101000106 其他 张蓝 女 1977-10-01 00:00:00.000
360725010101000201 本人或户主 刘长生 男 1948-04-01 00:00:00.000
360725010101000202 配偶 申群英 女 1954-07-01 00:00:00.000
360725010101000301 本人或户主 张保龙 男 1962-07-01 00:00:00.000
360725010101000302 配偶 李秀英 女 1962-06-01 00:00:00.000
360725010101000303 父母 蒋桂香 女 1931-01-01 00:00:00.000
360725010101000304 父母 张义祥 男 1916-01-01 00:00:00.000
vfp_system 2009-12-05
  • 打赏
  • 举报
回复
还麻烦你下,把那个0加进去。马上结帖啦
华夏小卒 2009-12-05
  • 打赏
  • 举报
回复
--> 测试数据: @table
declare @table table (code varchar(20),mark varchar(10),name varchar(6),sex varchar(2),date datetime)
insert into @table
select '3607250101010001','本人或户主','刘天福','男','1956-12-01' union all
select '3607250101010001','配偶','黄世珍','女','1960-04-01' union all
select '3607250101010001','子','刘承平','男','1977-05-01' union all
select '3607250101010001','女','刘承美','女','1984-02-01' union all
select '3607250101010001','女','刘先艳','女','2005-12-01' union all
select '3607250101010001','其他','张蓝','女','1977-10-01' union all
select '3607250101010002','本人或户主','刘长生','男','1948-04-01' union all
select '3607250101010002','配偶','申群英','女','1954-07-01' union all
select '3607250101010003','本人或户主','张保龙','男','1962-07-01' union all
select '3607250101010003','配偶','李秀英','女','1962-06-01' union all
select '3607250101010003','父母','蒋桂香','女','1931-01-01' union all
select '3607250101010003','父母','张义祥','男','1916-01-01'


----sql 2000 增加2位。01开始
select *,id=identity(int,1,1) into #t from @table

select code=code+right('0'+ltrim((select count(1) from #t where id<=t.id and code=t.code)),2),mark,name,sex,date
from #t t


/*
code mark name sex date
------------------------ ---------- ------ ---- -----------------------
360725010101000101 本人或户主 刘天福 男 1956-12-01 00:00:00.000
360725010101000102 配偶 黄世珍 女 1960-04-01 00:00:00.000
360725010101000103 子 刘承平 男 1977-05-01 00:00:00.000
360725010101000104 女 刘承美 女 1984-02-01 00:00:00.000
360725010101000105 女 刘先艳 女 2005-12-01 00:00:00.000
360725010101000106 其他 张蓝 女 1977-10-01 00:00:00.000
360725010101000201 本人或户主 刘长生 男 1948-04-01 00:00:00.000
360725010101000202 配偶 申群英 女 1954-07-01 00:00:00.000
360725010101000301 本人或户主 张保龙 男 1962-07-01 00:00:00.000
360725010101000302 配偶 李秀英 女 1962-06-01 00:00:00.000
360725010101000303 父母 蒋桂香 女 1931-01-01 00:00:00.000
360725010101000304 父母 张义祥 男 1916-01-01 00:00:00.000

(12 行受影响)
*/
drop table #t1


----sql 2000 增加1位。1开始
select *,id=identity(int,1,1) into #t1 from @table

select code=code+ ltrim((select count(1) from #t1 where id<=t.id and code=t.code)) ,mark,name,sex,date
from #t1 t

code mark name sex date
-------------------------------- ---------- ------ ---- -----------------------
36072501010100011 本人或户主 刘天福 男 1956-12-01 00:00:00.000
36072501010100012 配偶 黄世珍 女 1960-04-01 00:00:00.000
36072501010100013 子 刘承平 男 1977-05-01 00:00:00.000
36072501010100014 女 刘承美 女 1984-02-01 00:00:00.000
36072501010100015 女 刘先艳 女 2005-12-01 00:00:00.000
36072501010100016 其他 张蓝 女 1977-10-01 00:00:00.000
36072501010100021 本人或户主 刘长生 男 1948-04-01 00:00:00.000
36072501010100022 配偶 申群英 女 1954-07-01 00:00:00.000
36072501010100031 本人或户主 张保龙 男 1962-07-01 00:00:00.000
36072501010100032 配偶 李秀英 女 1962-06-01 00:00:00.000
36072501010100033 父母 蒋桂香 女 1931-01-01 00:00:00.000
36072501010100034 父母 张义祥 男 1916-01-01 00:00:00.000

(12 行受影响)
drop table #t1
nianran520 2009-12-05
  • 打赏
  • 举报
回复

--> 测试数据:@table
declare @table table([code] varchar(20),[mark] varchar(10),[name] varchar(6),[sex] varchar(2),[date] datetime)
insert @table
select '3607250101010001','本人或户主','刘天福','男','1956-12-01' union all
select '3607250101010001','配偶','黄世珍','女','1960-04-01' union all
select '3607250101010001','子','刘承平','男','1977-05-01' union all
select '3607250101010001','女','刘承美','女','1984-02-01' union all
select '3607250101010001','女','刘先艳','女','2005-12-01' union all
select '3607250101010001','其他','张蓝','女','1977-10-01' union all
select '3607250101010002','本人或户主','刘长生','男','1948-04-01' union all
select '3607250101010002','配偶','申群英','女','1954-07-01' union all
select '3607250101010003','本人或户主','张保龙','男','1962-07-01' union all
select '3607250101010003','配偶','李秀英','女','1962-06-01' union all
select '3607250101010003','父母','蒋桂香','女','1931-01-01' union all
select '3607250101010003','父母','张义祥','男','1916-01-01'


declare @i int
select @i = 0
update t set code = t.code+convert(varchar(20),@i-(select count(1) from @table where code < t.code)),
@i = @i + 1
from @table t

select * from @table

-----------------------------
36072501010100011 本人或户主 刘天福 男 1956-12-01 00:00:00.000
36072501010100012 配偶 黄世珍 女 1960-04-01 00:00:00.000
36072501010100013 子 刘承平 男 1977-05-01 00:00:00.000
36072501010100014 女 刘承美 女 1984-02-01 00:00:00.000
36072501010100015 女 刘先艳 女 2005-12-01 00:00:00.000
36072501010100016 其他 张蓝 女 1977-10-01 00:00:00.000
36072501010100021 本人或户主 刘长生 男 1948-04-01 00:00:00.000
36072501010100022 配偶 申群英 女 1954-07-01 00:00:00.000
36072501010100031 本人或户主 张保龙 男 1962-07-01 00:00:00.000
36072501010100032 配偶 李秀英 女 1962-06-01 00:00:00.000
36072501010100033 父母 蒋桂香 女 1931-01-01 00:00:00.000
36072501010100034 父母 张义祥 男 1916-01-01 00:00:00.000
vfp_system 2009-12-05
  • 打赏
  • 举报
回复
就是在第一个编码之后加一个序列号,但是第一个编码不相同就要重新从1开始,
wypc520,你给的还没达到要求,你给的都是一个序列号到底,并没有按不同的编码进行重新开始序列号
华夏小卒 2009-12-05
  • 打赏
  • 举报
回复
什么规律哦?
破折号 2009-12-05
  • 打赏
  • 举报
回复
一楼的有点小瑕疵。。。呵呵

insert @table
select 3607250101010001,'本人或户主','刘天福','男','1956-12-01' union all
select 3607250101010001,'配偶','黄世珍','女','1960-04-01' union all
select 3607250101010001,'子','刘承平','男','1977-05-01' union all
select 3607250101010001,'女','刘承美','女','1984-02-01' union all
select 3607250101010001,'女','刘先艳','女','2005-12-01' union all
select 3607250101010001,'其他','张蓝','女','1977-10-01'

declare @i int
select @i = 0
update @table set code = left(code,len(code))+(case when len(CONVERT(varchar(2),@i))<2 then '0'+CONVERT(varchar(2),@i) else CONVERT(varchar(2),@i) end),
@i = @i + 1

select * from @table

华夏小卒 2009-12-05
  • 打赏
  • 举报
回复
--> 测试数据: @table
declare @table table (code varchar(20),mark varchar(10),name varchar(6),sex varchar(2),date datetime)
insert into @table
select '3607250101010001','本人或户主','刘天福','男','1956-12-01' union all
select '3607250101010001','配偶','黄世珍','女','1960-04-01' union all
select '3607250101010001','子','刘承平','男','1977-05-01' union all
select '3607250101010001','女','刘承美','女','1984-02-01' union all
select '3607250101010001','女','刘先艳','女','2005-12-01' union all
select '3607250101010001','其他','张蓝','女','1977-10-01'




select *,id=identity(int,1,1) into #t from @table

select code=code+right('0'+ltrim((select count(1) from #t where id<=t.id)),2),mark,name,sex,date
from #t t


code mark name sex date
------------------------ ---------- ------ ---- -----------------------
360725010101000101 本人或户主 刘天福 男 1956-12-01 00:00:00.000
360725010101000102 配偶 黄世珍 女 1960-04-01 00:00:00.000
360725010101000103 子 刘承平 男 1977-05-01 00:00:00.000
360725010101000104 女 刘承美 女 1984-02-01 00:00:00.000
360725010101000105 女 刘先艳 女 2005-12-01 00:00:00.000
360725010101000106 其他 张蓝 女 1977-10-01 00:00:00.000

(6 行受影响)

drop table #t
vfp_system 2009-12-05
  • 打赏
  • 举报
回复
晕,按你的可倒是可以啦,我没描述清楚,我是要按第一个字段别进行编码的,结果如下,请你再仔细看看
36072501010100011 本人或户主 刘天福 男 1956-12-01
36072501010100012 配偶 黄世珍 女 1960-04-01
36072501010100013 子 刘承平 男 1977-05-01
36072501010100014 女 刘承美 女 1984-02-01
36072501010100015 女 刘先艳 女 2005-12-01
36072501010100016 其他 张蓝 女 1977-10-01
36072501010100021 本人或户主 刘长生 男 1948-04-01
36072501010100022 配偶 申群英 女 1954-07-01
36072501010100031 本人或户主 张保龙 男 1962-07-01
36072501010100032 配偶 李秀英 女 1962-06-01
36072501010100033 父母 蒋桂香 女 1931-01-01
36072501010100034 父母 张义祥 男 1916-01-01
vfp_system 2009-12-05
  • 打赏
  • 举报
回复
3607250101010001 本人或户主 刘天福 男 1956-12-01
3607250101010001 配偶 黄世珍 女 1960-04-01
3607250101010001 子 刘承平 男 1977-05-01
3607250101010001 女 刘承美 女 1984-02-01
3607250101010001 女 刘先艳 女 2005-12-01
3607250101010001 其他 张蓝 女 1977-10-01
3607250101010002 本人或户主 刘长生 男 1948-04-01
3607250101010002 配偶 申群英 女 1954-07-01
3607250101010003 本人或户主 张保龙 男 1962-07-01
3607250101010003 配偶 李秀英 女 1962-06-01
3607250101010003 父母 蒋桂香 女 1931-01-01
3607250101010003 父母 张义祥 男 1916-01-01
nianran520 2009-12-05
  • 打赏
  • 举报
回复
可以,我的也是[Quote=引用 3 楼 vfp_system 的回复:]
不记得说啦,我是SQLSERVER2000,不知道你这种写法能行得通吗?
[/Quote]
vfp_system 2009-12-05
  • 打赏
  • 举报
回复
不记得说啦,我是SQLSERVER2000,不知道你这种写法能行得通吗?
netcup 2009-12-05
  • 打赏
  • 举报
回复
数据和结果一模一样么?怎么弄?
nianran520 2009-12-05
  • 打赏
  • 举报
回复

--> 测试数据:@table
declare @table table([code] bigint,[mark] varchar(10),[name] varchar(6),[sex] varchar(2),[date] varchar(10))
insert @table
select 3607250101010001,'本人或户主','刘天福','男','1956-12-01' union all
select 3607250101010001,'配偶','黄世珍','女','1960-04-01' union all
select 3607250101010001,'子','刘承平','男','1977-05-01' union all
select 3607250101010001,'女','刘承美','女','1984-02-01' union all
select 3607250101010001,'女','刘先艳','女','2005-12-01' union all
select 3607250101010001,'其他','张蓝','女','1977-10-01'

declare @i int
select @i = 0
update @table set code = left(code,len(code)-1)+convert(varchar(20),@i),
@i = @i + 1

select * from @table

--结果
--------------------------
3607250101010001 本人或户主 刘天福 男 1956-12-01
3607250101010002 配偶 黄世珍 女 1960-04-01
3607250101010003 子 刘承平 男 1977-05-01
3607250101010004 女 刘承美 女 1984-02-01
3607250101010005 女 刘先艳 女 2005-12-01
3607250101010006 其他 张蓝 女 1977-10-01

34,590

社区成员

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

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