存储过程是个啥?

sky_too_sky 2010-08-18 10:37:28
今天碰到一个存储过程,以前从来没做过,想请高手帮助一下。
问题如下:
两个数据表,dt1,dt2.
dt1表:
id updatetime price
1 2010-04-01 00:00:00.000 50
2 2010-04-02 00:00:00.000 90
3 2008-06-01 00:00:00.000 100
4 2008-11-01 00:00:00.000 30

dt2表:
id pp dayt zl
1 yy 30 0.8
2 yy 60 0.7
3 yy 90 0.6

想要得到上表dt1中最终price结果,但是应该由dt2中的zl决定(price=price*zl),dt2中的zl由dt1表中的updatetime和现在时间差值再与dt2中的dayt比较得出(如小于30的为0.8)


问题是,如何用存储过程使得dt1中的price按照dt2中的zl变动而变动?实在是把自己弄迷糊了。
实在不会,请高手指点!谢谢啦!!!!!
...全文
362 23 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
sky_too_sky 2010-08-18
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 sqlcenter 的回复:]

SQL code
--> 测试数据:#1
if object_id('tempdb.dbo.#1') is not null drop table #1
create table #1(id int, updatetime datetime, price int)
insert into #1
select 1, '2010-04-01 00:00:00.000', 50 union all
……
[/Quote]

确实强大。但是我想问下,他是怎么实时更新的?能做点解释么?谢谢啦
sky_too_sky 2010-08-18
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 sqlcenter 的回复:]

SQL code
--> 测试数据:#1
if object_id('tempdb.dbo.#1') is not null drop table #1
create table #1(id int, updatetime datetime, price int)
insert into #1
select 1, '2010-04-01 00:00:00.000', 50 union all
……
[/Quote]

是不是我得传入数据。要不
select 1, '2010-04-01 00:00:00.000', 50 union all
select 2, '2010-04-02 00:00:00.000', 90 union all
select 3, '2008-06-01 00:00:00.000', 100 union all
select 4, '2008-11-01 00:00:00.000', 30
这个数据好多好多咋整,是不?
sky_too_sky 2010-08-18
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 sqlcenter 的回复:]

唉,一个case when不就完了吗
[/Quote]

什么格式的?
我自己乱写的是这样的:
declare @d1 datetime,
@d2 int,
@price nvarchar(50),
@cname nvarchar(50),
@dayd int,
@zl decimal(6, 2)
begin
select @d1=SaleTime from Product
end
begin
select @cname=Brand,@dayd=Days,@zl=Discount from ProdPriceStandard
end
select @d2=datediff(day,@d1,getdate())
if(@cname='kk')
begin
if(@d2<=30)
SELECT Price*0.78 FROM Product
else if(@d2+30 <= 60)
SELECT Price*0.75 FROM Product
else if(@d2+60 <=90)
SELECT Price*0.72 FROM Product
end
else if(@cname='jj')
begin
SELECT * FROM ProdPriceStandard
end
END
SQLCenter 2010-08-18
  • 打赏
  • 举报
回复
--> 测试数据:#1
if object_id('tempdb.dbo.#1') is not null drop table #1
create table #1(id int, updatetime datetime, price int)
insert into #1
select 1, '2010-04-01 00:00:00.000', 50 union all
select 2, '2010-04-02 00:00:00.000', 90 union all
select 3, '2008-06-01 00:00:00.000', 100 union all
select 4, '2008-11-01 00:00:00.000', 30
--> 测试数据:#2
if object_id('tempdb.dbo.#2') is not null drop table #2
create table #2(id int, pp varchar(8), dayt int, zl numeric(2,1))
insert into #2
select 1, 'yy', 30, 0.8 union all
select 2, 'yy', 60, 0.7 union all
select 3, 'yy', 90, 0.6

update #1 set price = price *
case
when datediff(day,updatetime,getdate()) < 30 then 0.8
when datediff(day,updatetime,getdate()) > 90 then 0.6
else 0.7
end

select * from #1

/*
id updatetime price
----------- ----------------------- -----------
1 2010-04-01 00:00:00.000 30
2 2010-04-02 00:00:00.000 54
3 2008-06-01 00:00:00.000 60
4 2008-11-01 00:00:00.000 18
*/
sky_too_sky 2010-08-18
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 hq0927 的回复:]

不知道是不是你要的结果

SQL code

--测试数据
declare @tb_A table(tid int,updatetime datetime,price int)
declare @tb_B table(tid int,pp varchar(10),dayt int,zl decimal(10,2))

insert into @tb_A(tid,updatetime,pri……
[/Quote]

不过:
insert into @tb_A(tid,updatetime,price) values(1,'2010-04-01 00:00:00.000',50)
insert into @tb_A(tid,updatetime,price) values(2,'2010-04-02 00:00:00.000', 90)
insert into @tb_A(tid,updatetime,price) values(3,'2008-06-01 00:00:00.000', 100)
insert into @tb_A(tid,updatetime,price) values(4,'2008-11-01 00:00:00.000', 30)
insert into @tb_B(tid,pp,dayt,zl) values(1,'yy',30,0.8)
insert into @tb_B(tid,pp,dayt,zl) values(2,'yy',60,0.7)
insert into @tb_B(tid,pp,dayt,zl) values(3,'yy',90,0.6)
数据量大了我咋整?
SQLCenter 2010-08-18
  • 打赏
  • 举报
回复
唉,一个case when不就完了吗
sky_too_sky 2010-08-18
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 hq0927 的回复:]

不知道是不是你要的结果

SQL code

--测试数据
declare @tb_A table(tid int,updatetime datetime,price int)
declare @tb_B table(tid int,pp varchar(10),dayt int,zl decimal(10,2))

insert into @tb_A(tid,updatetime,pri……
[/Quote]

恩。调试一哈。谢谢啦
sky_too_sky 2010-08-18
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 sqlcenter 的回复:]

SQL code
/*
id updatetime price dt1表中的updatetime和现在时间差
----------- ----------------------- ----------- -------------------------------
1 2010-04-01 00:00:00.000……
[/Quote]

哦,明白了。大于90都是0.6 。不好意思举例没举好!我想要看的是思路,所以没太注意那个。
SQLCenter 2010-08-18
  • 打赏
  • 举报
回复
/*
id updatetime price dt1表中的updatetime和现在时间差
----------- ----------------------- ----------- -------------------------------
1 2010-04-01 00:00:00.000 50 139
2 2010-04-02 00:00:00.000 90 138
3 2008-06-01 00:00:00.000 100 808
4 2008-11-01 00:00:00.000 30 655
*/

/*
id pp dayt zl
----------- -------- ----------- ---------------------------------------
1 yy 30 0.8
2 yy 60 0.7
3 yy 90 0.6
*/

dt2中的zl由dt1表中的updatetime和现在时间差值再与dt2中的dayt比较得出(如小于30的为0.8)
------------
有命中的dayt吗
hq0927 2010-08-18
  • 打赏
  • 举报
回复
不知道是不是你要的结果


--测试数据
declare @tb_A table(tid int,updatetime datetime,price int)
declare @tb_B table(tid int,pp varchar(10),dayt int,zl decimal(10,2))

insert into @tb_A(tid,updatetime,price) values(1,'2010-04-01 00:00:00.000',50)
insert into @tb_A(tid,updatetime,price) values(2,'2010-04-02 00:00:00.000', 90)
insert into @tb_A(tid,updatetime,price) values(3,'2008-06-01 00:00:00.000', 100)
insert into @tb_A(tid,updatetime,price) values(4,'2008-11-01 00:00:00.000', 30)
insert into @tb_B(tid,pp,dayt,zl) values(1,'yy',30,0.8)
insert into @tb_B(tid,pp,dayt,zl) values(2,'yy',60,0.7)
insert into @tb_B(tid,pp,dayt,zl) values(3,'yy',90,0.6)

select (case when datediff(day,getdate(),a.updatetime)-b.dayt>30 then
0.8 else zl end) as zl,a.tid into #tt

From @tb_A a,@tb_B b where a.tid=b.tid
select a.price*b.zl as price from @tb_a a ,#tt b where a.tid=b.tid
drop table #tt
sky_too_sky 2010-08-18
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 sqlcenter 的回复:]

你给出的数据,没有一个距今小于90天的,这种情况如何处理未明
[/Quote]

?不懂?只要在一个价格区间我就可以认为它是那个折率啊!
SQLCenter 2010-08-18
  • 打赏
  • 举报
回复
你给出的数据,没有一个距今小于90天的,这种情况如何处理未明
sky_too_sky 2010-08-18
  • 打赏
  • 举报
回复
是地,得到zl后再更新dt1中的price,要实时更新,新手没弄过。
ws_hgo 2010-08-18
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 sky_too_sky 的回复:]
如果是用程序好实现。不过老大一定得让用存储过程。我实在不会啦。谢谢大家,帮帮忙啊!
[/Quote]
问题都没有说清楚

是不是根据dt1的时间和当前的时间比较得到差值
然后与dt2中的dayt比较根据不同的范围得到不同的z1
sky_too_sky 2010-08-18
  • 打赏
  • 举报
回复
如果是用程序好实现。不过老大一定得让用存储过程。我实在不会啦。谢谢大家,帮帮忙啊!
sky_too_sky 2010-08-18
  • 打赏
  • 举报
回复
结果就是dt1自动跟新!
SQLCenter 2010-08-18
  • 打赏
  • 举报
回复
晕了,第二个表就是的。
SQLCenter 2010-08-18
  • 打赏
  • 举报
回复
或者有个规则枚举,30天0.8 60/0.7...
SQLCenter 2010-08-18
  • 打赏
  • 举报
回复
应该还有个打折时间差表
ws_hgo 2010-08-18
  • 打赏
  • 举报
回复
结果是???
加载更多回复(3)

27,582

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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