存储过程是个啥?

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变动而变动?实在是把自己弄迷糊了。
实在不会,请高手指点!谢谢啦!!!!!
...全文
363 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)
慧龙照片恢复软件是一个特殊的数据恢复工具,专门用于恢复误删除、格式化、文件系统错误、分区打不开等造成的照片文件丢失;支持硬盘、光盘、U盘、MP3、数码相机、手机、存储卡等存储介质。支持FAT、FAT32、NTFS、CDFS等各种分区格式,但不能恢复在NTFS分区中压缩存储的文件,也不能恢复加密的文件。全盘扫描查找照片数据,不放过任何一个可恢复的照片文件。   慧龙照片恢复软件在恢复文件过程中不会往源分区写入数据,因此可保证不会对源数据造成再次损害,可放心使用。软件还支持从磁盘映像文件中恢复照片文件,方便进行异地数据恢复,软件本身也具有制作磁盘映像文件的功能。   本软件目前仅支持恢复JPG格式的照片文件(更多文件格式正在增加中),JPG格式是最流行的数码照片文件格式,绝大多数数码相机及拍照手机均采用该格式存储照片,因此慧龙照片恢复软件能胜任绝大多数照片文件的恢复任务,照片恢复的成功率也很高。   慧龙照片恢复软件会提取照片文件中的拍照时间,作为恢复出来的文件修改时间,方便恢复后对照片进行整理。只要在文件夹里选择按“修改时间”排序,照片就是按拍照的先后顺序排列了,非常方便。   提示: 不要下载软件到要恢复数据的盘符里,也不要解压文件到要恢复的盘符里,否则可能再次破坏源数据。如果是相机直接连接电脑进行数据恢复,请保证电池电量足够,免得恢复过程中耗完电了,下次又要重新扫描。   为什么选择慧龙照片恢复软件?与其他数据恢复软件相比,慧龙照片恢复软件具有以下特点:   1. 逐一扫描存储扇区,寻找照片数据,提高照片文件恢复成功率;   2. 使用超简单,鼠标点击几下即可开始恢复;   3. 体积小,下载快,绿色软件,无需安装,不会在系统里留下任何垃圾;   4. 不依赖于文件系统,即使目录区、文件分配表完全损毁也能进行恢复;   5. 支持从映像文件恢复照片,因而可完全避免反复扫描对源数据造成损害;软件本身也包含制作映像文件的功能。

27,582

社区成员

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

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