关于sql2000批量替换本表内数据的问题

dcjz 2010-05-21 06:22:39

想要把 2010年 5月的、 用户编码为 002开头的 所有用户 的 上月表码 T-sql 为 他在2010年4月的本月表码;
比方说 用户编码为 0021,四月份本月表码为 20.0 五月上月表码为30.0 即要把 30.0 替换成 20.0
求解!!!

表的生成语句:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF NOT EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[用户基础信息]') AND OBJECTPROPERTY(id, N'IsUserTable') = 1)
BEGIN
CREATE TABLE [dbo].[用户基础信息](
[序号] [decimal](18, 0) NOT NULL,
[用户编码] [char](10) NULL,
[月份] [char](8) NULL,
[上月表码] [decimal](9, 2) NULL,
[本月表码] [decimal](9, 2) NULL,
[水损] [decimal](9, 2) NULL,
[实际用水] [decimal](9, 2) NULL,
[饮水井点播] [decimal](9, 2) NULL,
[灌溉井灌溉] [decimal](9, 2) NULL,
[抄表日期] [datetime] NULL,
[抄表人] [char](8) NULL,
[收款人] [char](8) NULL,
[滞纳金] [decimal](9, 2) NULL,
[收款号码] [decimal](18, 0) NULL,
[本月人口数] [int] NULL,
[其它项目] [decimal](9, 2) NULL,
[应收水费] [decimal](9, 2) NULL,
[实收水费] [decimal](9, 2) NULL,
[状态] [char](1) NULL,
[记账员] [char](8) NULL,
[操作员] [char](8) NULL,
[灌溉收费] [decimal](9, 2) NULL,
[调零] [decimal](9, 1) NULL,
CONSTRAINT [PK_用户基础信息] PRIMARY KEY NONCLUSTERED
(
[序号] ASC
) ON [PRIMARY]
) ON [PRIMARY]
END




上几条测试数据:

285309 0080040074 200911 77.00 80.00 0.00 3.00 0.00 0.00 2009-11-17 00:00:00.000 0.00 200911 1 0.00 4.50 4.50 1 徐向永 徐向永 0.00 NULL
285310 0080040075 200911 197.00 205.00 0.00 8.00 0.00 0.00 2009-11-17 00:00:00.000 0.00 200911 1 0.00 12.00 12.00 1 徐向永 徐向永 0.00 NULL
285311 0080040076 200911 86.00 89.00 0.00 3.00 0.00 0.00 2009-11-17 00:00:00.000 0.00 200911 1 0.00 4.50 4.50 1 徐向永 徐向永 0.00 NULL
285312 0080040077 200911 95.00 98.00 0.00 3.00 0.00 0.00 2009-11-17 00:00:00.000 0.00 200911 1 0.00 4.50 4.50 1 徐向永 徐向永 0.00 NULL
285313 0080040078 200911 59.00 62.00 0.00 3.00 0.00 0.00 2009-11-17 00:00:00.000 0.00 200911 1 0.00 4.50 4.50 1 徐向永 徐向永 0.00 NULL
285314 0080040079 200911 96.00 97.00 0.00 1.00 0.00 0.00 2009-11-17 00:00:00.000 0.00 200911 1 0.00 1.50 1.50 1 徐向永 徐向永 0.00 NULL
...全文
160 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
dcjz 2010-05-22
  • 打赏
  • 举报
回复
起床 继续 研究
dcjz 2010-05-22
  • 打赏
  • 举报
回复
发完分之后我发现好多人都是一样的。。。。。。。
dcjz 2010-05-22
  • 打赏
  • 举报
回复


十分感谢 我做梦都不会忘记您的大恩大德。。。。

dawugui 2010-05-21
  • 打赏
  • 举报
回复
最好给出完整的表结构,测试数据,计算方法和正确结果.


发帖注意事项
http://topic.csdn.net/u/20091130/21/fb718680-98ff-4afb-98d8-cff2f8293ed5.html?24281
dawugui 2010-05-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 my860310 的回复:]
问题 没解决掉 倒是喝多了。。。。
[/Quote]
不懂,帮顶,学习,蹭分.
永生天地 2010-05-21
  • 打赏
  • 举报
回复

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[用户基础信息]') AND OBJECTPROPERTY(id, N'IsUserTable') = 1)
DROP TABLE 用户基础信息
GO
CREATE TABLE [dbo].[用户基础信息](
[序号] [decimal](18, 0) NULL,
[用户编码] [char](10) NULL,
[月份] [char](8) NULL,
[上月表码] [decimal](9, 2) NULL,
[本月表码] [decimal](9, 2) NULL,
[水损] [decimal](9, 2) NULL,
[实际用水] [decimal](9, 2) NULL,
[饮水井点播] [decimal](9, 2) NULL,
[灌溉井灌溉] [decimal](9, 2) NULL,
[抄表日期] [datetime] NULL,
[抄表人] [char](8) NULL,
[收款人] [char](8) NULL,
[滞纳金] [decimal](9, 2) NULL,
[收款号码] [decimal](18, 0) NULL,
[本月人口数] [int] NULL,
[其它项目] [decimal](9, 2) NULL,
[应收水费] [decimal](9, 2) NULL,
[实收水费] [decimal](9, 2) NULL,
[状态] [char](1) NULL,
[记账员] [char](8) NULL,
[操作员] [char](8) NULL,
[灌溉收费] [decimal](9, 2) NULL,
[调零] [decimal](9, 1) NULL
) ON [PRIMARY]

insert 用户基础信息 (用户编码,月份,上月表码,本月表码)
select '0020040074','200911', 77.00, 80.00 union all
select '0020040075','200911', 77.00, 80.00 union all
select '0020040076','200911', 77.00, 80.00 union all
select '0020040074','200912', 90.00, 100.00 union all
select '0020040075','200912', 77.00, 80.00 union all
select '0020040076','200912', 77.00, 80.00 union all
select '0020040074','201001', 110.00, 130.00
--先select看结果
select a.*,b.本月表码 from 用户基础信息 a left join 用户基础信息 b
on convert(datetime,rtrim(a.月份)+'01')=dateadd(m,1,convert(datetime,rtrim(b.月份)+'01'))
and a.用户编码=b.用户编码
where left(a.用户编码,3)='002'

/*
序号 用户编码 月份 上月表码 本月表码 水损 实际用水 饮水井点播 灌溉井灌溉 抄表日期 抄表人 收款人 滞纳金 收款号码 本月人口数 其它项目 应收水费 实收水费 状态 记账员 操作员 灌溉收费 调零 本月表码
-------------------- ---------- -------- ----------- ----------- ----------- ----------- ----------- ----------- ------------------------------------------------------ -------- -------- ----------- -------------------- ----------- ----------- ----------- ----------- ---- -------- -------- ----------- ----------- -----------
NULL 0020040074 200911 77.00 80.00 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
NULL 0020040075 200911 77.00 80.00 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
NULL 0020040076 200911 77.00 80.00 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
NULL 0020040074 200912 90.00 100.00 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 80.00
NULL 0020040075 200912 77.00 80.00 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 80.00
NULL 0020040076 200912 77.00 80.00 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 80.00
NULL 0020040074 201001 110.00 130.00 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 100.00

(所影响的行数为 7 行)

*/
--再update
update a set a.上月表码=b.本月表码
from 用户基础信息 a left join 用户基础信息 b
on convert(datetime,rtrim(a.月份)+'01')=dateadd(m,1,convert(datetime,rtrim(b.月份)+'01'))
and a.用户编码=b.用户编码
where left(a.用户编码,3)='002' and b.本月表码 is not null

select * from 用户基础信息

/*
序号 用户编码 月份 上月表码 本月表码 水损 实际用水 饮水井点播 灌溉井灌溉 抄表日期 抄表人 收款人 滞纳金 收款号码 本月人口数 其它项目 应收水费 实收水费 状态 记账员 操作员 灌溉收费 调零
-------------------- ---------- -------- ----------- ----------- ----------- ----------- ----------- ----------- ------------------------------------------------------ -------- -------- ----------- -------------------- ----------- ----------- ----------- ----------- ---- -------- -------- ----------- -----------
NULL 0020040074 200911 77.00 80.00 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
NULL 0020040075 200911 77.00 80.00 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
NULL 0020040076 200911 77.00 80.00 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
NULL 0020040074 200912 80.00 100.00 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
NULL 0020040075 200912 80.00 80.00 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
NULL 0020040076 200912 80.00 80.00 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
NULL 0020040074 201001 100.00 130.00 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL

(所影响的行数为 7 行)

*/
dcjz 2010-05-21
  • 打赏
  • 举报
回复

问题 没解决掉 倒是喝多了。。。。
htl258_Tony 2010-05-21
  • 打赏
  • 举报
回复

--最后加下你要的条件
Update a Set
a.上月表码=b.本月表码
From [用户基础信息] a,[用户基础信息] b
Where a.用户编码=b.用户编码
And datediff(mm,rtrim(b.月份)+'01',rtrim(a.月份)+'01')=1 --你的表结构为CHAR(8),所以要加个RTRIM
And a.[用户编码] Like '002%'
And a.[月份] like '201005%'
htl258_Tony 2010-05-21
  • 打赏
  • 举报
回复
-->修改一下:
Update a Set
a.上月表码=b.本月表码
From [用户基础信息] a,[用户基础信息] b
Where a.用户编码=b.用户编码
And datediff(mm,rtrim(b.月份)+'01',rtrim(a.月份)+'01')=1 --你的表结构为CHAR(8),所以要加个RTRIM
htl258_Tony 2010-05-21
  • 打赏
  • 举报
回复
-->SQL查询如下:
Update a Set
a.上月表码=b.本月表码
From [用户基础信息] a,[用户基础信息] b
Where a.用户编码=b.用户编码
And datediff(mm,b.月份+'01',a.月份+'01')=1

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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