各位大大帮帮小弟!急..............在线等!!!!!!!!!

chmz 2003-12-06 12:07:02
小弟现遇到一个问题:现有一个表A,字段分别有:name,category,lasteditby,lastiedidt。

name,category,lasteditby都是varchar,lastedidt是datetime.
举例说明:
现有这样的数据:
name category lasteditby lastiedidt
1. ID-001 012003121 01 2003-12-05 09:13:17.217
2. ID-001 012003122 01 2003-12-05 09:14:20.220
3. ID-001 012003123 01 2003-12-05 09:10:01.217
.
.
.
.
9. ID-001 012003129 01 2003-12-05 11:03:11.245
10. ID-001 0120031210 01 2003-12-05 11:07:08.045
.
.
.
.
说明:category的值是这样取得的:前二位是lasteditby的值,3-6位是年份,7-8位是月份,而
从第十位开始就是数字了
现在的问题是:category的值是从前一个数据的基础上在从第十位算起的数字加上1得到的,这样
的算法该用怎样的SQL语句???
...全文
42 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjcxc 元老 2003-12-06
  • 打赏
  • 举报
回复
--查询
select category=lasteditby+convert(varchar(6),lastiedidt,112)
+cast((select sum(1) from 表a where name=a.name and lastiedidt<=a.lastiedidt) as varchar)
from 表a a

--更新
update 表a set category=a.lasteditby+convert(varchar(6),a.lastiedidt,112)
+cast((select sum(1) from 表a where name=a.name and lastiedidt<=a.lastiedidt) as varchar)
from 表a a
zjcxc 元老 2003-12-06
  • 打赏
  • 举报
回复
你是想生成这个字段的值?
cm8983 2003-12-06
  • 打赏
  • 举报
回复
由于刚开始这个表是根本就没有数据的!因此上面 cm8983(浪侠) 的方法行不通?


select (case when max(category) is null then ...不是在判断吗?


估计你没测试过,这条语句最好放在触发器里.
买房人生 2003-12-06
  • 打赏
  • 举报
回复
这太麻烦了,有没有更简单的方法!为了能使程序的运行的快点,所以想用存储过程,本来这个过程在程序里早就解决了.
zjcxc 元老 2003-12-06
  • 打赏
  • 举报
回复
楼主有没有看我上面的例子?


--创建一个触发器就行了,自动生成category的值:
create trigger t_insert on 表A
for insert
as
update 表a set category=a.lasteditby+convert(varchar(6),a.lastedidt,112)
+cast((select sum(1) from 表a where name=a.name and lastedidt<=a.lastedidt) as varchar)
from 表a a where isnull(category,'')=''
go
买房人生 2003-12-06
  • 打赏
  • 举报
回复
不行啊!各位大大忙点帮忙啊!

由于刚开始这个表是根本就没有数据的!因此上面 cm8983(浪侠) 的方法行不通!
zjcxc 元老 2003-12-06
  • 打赏
  • 举报
回复
--如果楼主是想在插入数据的时候,自动生成category的值,就用:

go
--创建表
create table 表A(name varchar(6),category varchar(20),lasteditby varchar(2),lastedidt datetime)
go
--创建触发器,自动生成category的值:
create trigger t_insert on 表A
for insert
as
update 表a set category=a.lasteditby+convert(varchar(6),a.lastedidt,112)
+cast((select sum(1) from 表a where name=a.name and lastedidt<=a.lastedidt) as varchar)
from 表a a where isnull(category,'')=''
go

--插入数据测试(注意,我插入数据的时候并没有给category赋值)
insert into 表A
select 'ID-001',null,'01','2003-12-05 09:13:17.217'
union all select 'ID-001',null,'01','2003-12-05 09:14:20.220'
union all select 'ID-001',null,'01','2003-12-05 09:10:01.217'
union all select 'ID-001',null,'01','2003-12-05 11:03:11.245'
union all select 'ID-002',null,'01','2003-12-05 11:07:08.045'

--显示结果
select * from 表A order by name,lasteditby,lastedidt

go
--删除测试环境
drop table 表A

/*--测试结果
name category lasteditby lastedidt
------ -------------------- ---------- -------------------------
ID-001 012003121 01 2003-12-05 09:10:01.217
ID-001 012003122 01 2003-12-05 09:13:17.217
ID-001 012003123 01 2003-12-05 09:14:20.220
ID-001 012003124 01 2003-12-05 11:03:11.247
ID-002 012003121 01 2003-12-05 11:07:08.047

(所影响的行数为 5 行)
--*/
zjcxc 元老 2003-12-06
  • 打赏
  • 举报
回复
--下面是数据测试

--测试数据
create table 表A(name varchar(6),category varchar(20),lasteditby varchar(2),lastedidt datetime)
insert into 表A
select 'ID-001',null,'01','2003-12-05 09:13:17.217'
union all select 'ID-001',null,'01','2003-12-05 09:14:20.220'
union all select 'ID-001',null,'01','2003-12-05 09:10:01.217'
union all select 'ID-001',null,'01','2003-12-05 11:03:11.245'
union all select 'ID-001',null,'01','2003-12-05 11:07:08.045'

go
--直接查询得到category
select name,category=lasteditby+convert(varchar(6),lastedidt,112)
+cast((select sum(1) from 表a where name=a.name and lastedidt<=a.lastedidt) as varchar)
,lasteditby,lastedidt
from 表a a order by name,lasteditby,lastedidt

go
--更新表,生成category
update 表a set category=a.lasteditby+convert(varchar(6),a.lastedidt,112)
+cast((select sum(1) from 表a where name=a.name and lastedidt<=a.lastedidt) as varchar)
from 表a a

--显示更新结果
select * from 表A order by name,lasteditby,lastedidt
go
--删除测试环境
drop table 表A

/*--测试结果

--直接查询的结果
name category lasteditby lastedidt
------ -------------------- ---------- -------------------------
ID-001 012003121 01 2003-12-05 09:10:01.217
ID-001 012003122 01 2003-12-05 09:13:17.217
ID-001 012003123 01 2003-12-05 09:14:20.220
ID-001 012003124 01 2003-12-05 11:03:11.247
ID-001 012003125 01 2003-12-05 11:07:08.047

(所影响的行数为 5 行)


--更新处理的结果

name category lasteditby lastedidt
------ -------------------- ---------- -------------------------
ID-001 012003121 01 2003-12-05 09:10:01.217
ID-001 012003122 01 2003-12-05 09:13:17.217
ID-001 012003123 01 2003-12-05 09:14:20.220
ID-001 012003124 01 2003-12-05 11:03:11.247
ID-001 012003125 01 2003-12-05 11:07:08.047

(所影响的行数为 5 行)
--*/
买房人生 2003-12-06
  • 打赏
  • 举报
回复
能不能举例说明一下???
cm8983 2003-12-06
  • 打赏
  • 举报
回复
主要是控制位数的,1000001+1为1000002,截3位后为'002',2前面的0不被截.
买房人生 2003-12-06
  • 打赏
  • 举报
回复
这句:right(ltrim(rtrim(cast(('1000000'+(max(right(category,3))+1)) as char))),3)能否解释一下?
cm8983 2003-12-06
  • 打赏
  • 举报
回复
计算生成200312后面的序号
select (case when max(category) is null then '01'+convert(char(6),getdate(),112)+'001'
else left(max(category),8)+right(ltrim(rtrim(cast(('1000000'+(max(right(category,3))+1)) as char))),3) end)
from A
where substring(category,3,6)=convert(char(6),getdate(),112)
其他的你再改一下
买房人生 2003-12-06
  • 打赏
  • 举报
回复
小弟就是不知该怎样计算生成200312后面的序号
victorycyz 2003-12-06
  • 打赏
  • 举报
回复
看你的需求,觉得这个字段只要记录年、月就行了。如200312头两位和后面的序号可以在查询时计算生成。
chmz 2003-12-06
  • 打赏
  • 举报
回复
先说明一下:开始这个字段的不没有值的,等有了值后,再在这个值的基础上在数字位上加1,依此类推>

34,874

社区成员

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

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