急在线等!SQL语句中怎么批量更新第一行第五列数据等于第二行第三列数据减1。

半桶水IT民工 2020-05-30 04:47:38
怎么使用SQL语句批量更新第一行第五列数据等于第二行第三列数据减1。
这是我的一个数据表表单,我需要修正“IT修正调价失效日期”列的数据。
DROP DATABASE TEST001

CREATE DATABASE TEST001
--创建数据库

USE
TEST001
--连接数据库

DROP TABLE 商品价目表
--删除表

CREATE TABLE 商品价目表
(商品名称 varchar(200),
商品价格 NUMERIC(10,2),
调价生效日 DATE,
调价失效日 DATE,
IT修正调价失效日期 DATE
)
--创建表

INSERT INTO 商品价目表(商品名称,商品价格,调价生效日,调价失效日) values
('iPhone SE2','3299','2020-5-1','2020-12-31'),
('iPhone SE2','3099','2020-6-1','2020-12-31'),
('华为P40 Pro','5988','2020-4-1','2020-12-31'),
('华为P40 Pro','5588','2020-5-1','2020-12-31'),
('华为P40 Pro','5288','2020-6-1','2020-12-31'),
('小米10 Pro','4999','2020-3-1','2020-12-31'),
('小米10 Pro','4999','2020-3-1','2020-12-31'),
('小米10 Pro','4599','2020-4-1','2020-12-31'),
('小米10 Pro','4399','2020-5-1','2020-12-31')

--插入数据

SELECT * FROM 商品价目表
--查询表


请问一下大神,怎么使用SQL语句根据表单现有的表单结果去批量更新“IT修正调价失效日期”列的日期,而且不能更新错列。
已知“IT修正调价失效日期”等于相同“商品名称”第2次调整的“调价生效日”减1。
该表单一共有10多万行,而且“商品名称”出现的行次数不固定,有2行的、有3行的、有的4行,行重复数据也有,真心求解决方法
...全文
195 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
半桶水IT民工 2020-05-31
  • 打赏
  • 举报
回复
引用 1 楼 砸死牛顿的苹果 的回复:
就是按商品名称分组 调价生效日 排序的顺序 进行 递推赋值咯
大神666.
  • 打赏
  • 举报
回复
你是更新原表内容,上面语句要改下
with 
t as
	(select 
		seq=row_number()over(partition by 商品名称 order by 调价生效日 desc)
		,t.商品名称
		,t.商品价格
		,t.调价生效日
		,t.调价失效日
		,t.IT修正调价失效日期 
	from 商品价目表 t
	)
,cte as
	(select t.*,cast(null as date)as IT修正调价失效日期2 from t where seq=1
	
	union all
	
	select t.*,dateadd(d,-1,cte.调价生效日)
	from cte,t where t.商品名称 =cte.商品名称 and  t.seq =cte.seq +1
	)
update t set t.IT修正调价失效日期=cte.IT修正调价失效日期2 
from 商品价目表 t,cte 
where t.商品名称 =cte.商品名称 and t.调价生效日 =cte.调价生效日 

go
select * from 商品价目表 order by 商品名称,调价生效日
  • 打赏
  • 举报
回复
with 
t as
	(select 
		seq=row_number()over(partition by 商品名称 order by 调价生效日 desc)
		,t.商品名称
		,t.商品价格
		,t.调价生效日
		,t.调价失效日 
	from 商品价目表 t
	)
,cte as
	(select t.*,cast(null as date)as IT修正调价失效日期 from t where seq=1
	
	union all
	
	select t.seq,t.商品名称,t.商品价格,t.调价生效日,t.调价失效日,dateadd(d,-1,cte.调价生效日)
	from cte,t where t.商品名称 =cte.商品名称 and  t.seq =cte.seq +1
	)
select 商品名称,商品价格,调价生效日,调价失效日,IT修正调价失效日期 from cte order by 商品名称,调价生效日
/* 商品名称 商品价格 调价生效日 调价失效日 IT修正调价失效日期 iPhone SE2 3299.00 2020-05-01 2020-12-31 2020-05-31 iPhone SE2 3099.00 2020-06-01 2020-12-31 NULL 华为P40 Pro 5988.00 2020-04-01 2020-12-31 2020-04-30 华为P40 Pro 5588.00 2020-05-01 2020-12-31 2020-05-31 华为P40 Pro 5288.00 2020-06-01 2020-12-31 NULL 小米10 Pro 4999.00 2020-03-01 2020-12-31 2020-03-31 小米10 Pro 4999.00 2020-03-01 2020-12-31 2020-02-29 小米10 Pro 4599.00 2020-04-01 2020-12-31 2020-04-30 小米10 Pro 4399.00 2020-05-01 2020-12-31 NULL */
  • 打赏
  • 举报
回复
就是按商品名称分组 调价生效日 排序的顺序 进行 递推赋值咯

22,298

社区成员

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

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