~~~!!!复杂的SQL!!!~~~
create table #t1
(
id int identity,
sku_id int,
qty int ,
avg_qty decimal(18,2) default 0
)
insert into #t1(sku_id,qty) values(12,200)
insert into #t1(sku_id,qty) values(12,130)
insert into #t1(sku_id,qty) values(12,330)
insert into #t1(sku_id,qty) values(12,110)
insert into #t1(sku_id,qty) values(15,120)
insert into #t1(sku_id,qty) values(15,500)
insert into #t1(sku_id,qty) values(15,520)
第1条avg_qty = qty
第2条avg_qty = 上一条的avg_qty*0.4+本条qty*0.6
第3条依次类推
print 200
print 200 * 0.4 + 130 * 0.6
print (200 * 0.4 + 130 * 0.6) * 0.4 + 330 * 0.6
print ((200 * 0.4 + 130 * 0.6) * 0.4 + 330 * 0.6)* 0.4 + 110 * 0.6
print 120
print 120 * 0.4 + 500 * 0.6
print (120 * 0.4 + 500 * 0.6) * 0.4 + 520 * 0.6
结果如下:
id sku_id qty avg_qty
1 12 200 200.00
2 12 130 158.00
3 12 330 261.20
4 12 110 170.48
5 15 120 120.00
6 15 500 348.00
7 15 520 451.20
求最佳算法SQL
问题点数:100、回复次数:14Top
1 楼iamltd(妖)回复于 2006-03-21 10:40:22 得分 0
看起来只能用游标了,想不出其他办法。
操作太复杂了,晕啊Top
2 楼geniusli(纠级天使)回复于 2006-03-21 10:47:43 得分 0
我想问问是不是每四条都重新算起?Top
3 楼rivery(river)回复于 2006-03-21 10:49:57 得分 0
declare @temp decimal(18,2)
update #t1
set @temp=case when @temp is null then qty else @temp*0.4+qty*0.6 end,
avg_qty=@temp
select * from #t1
select qty from #t1 where 1>2
/*
结果
1 12 200 200.00
2 12 130 158.00
3 12 330 261.20
4 12 110 170.48
5 15 120 140.19
6 15 500 356.08
7 15 520 454.43
*/Top
4 楼rivery(river)回复于 2006-03-21 10:54:44 得分 0
--如果是每4条一计算。那么:
declare @temp decimal(18,2)
update a
set @temp=case when @temp is null then qty
when (select count(*) from #t1 where id<a.id)=4 then qty
else @temp*0.4+qty*0.6 end,
avg_qty=@temp
from #t1 a
select * from #t1
/*
结果
1 12 200 200.00
2 12 130 158.00
3 12 330 261.20
4 12 110 170.48
5 15 120 120.00
6 15 500 348.00
7 15 520 451.20
*/Top
5 楼rivery(river)回复于 2006-03-21 10:55:30 得分 0
第一贴中:多了个select qty from #t1 where 1>2,不需要。Top
6 楼DanielSunny(daniel)回复于 2006-03-21 11:08:17 得分 0
这样计算效率不高,行计算了。请用SQL & join 作出本题。Top
7 楼popohei(牛头山的小怪)回复于 2006-03-21 11:11:02 得分 0
楼上的可能错了
要根据sku_id 来填,Top
8 楼DanielSunny(daniel)回复于 2006-03-21 11:23:57 得分 0
对呀,如果用update那么sku_id也要考虑。Top
9 楼happyflystone(无枪的狙击手)回复于 2006-03-21 11:28:19 得分 50
create table #t1
(
id int identity,
sku_id int,
qty int ,
avg_qty decimal(18,2) default 0
)
insert into #t1(sku_id,qty) values(12,200)
insert into #t1(sku_id,qty) values(12,130)
insert into #t1(sku_id,qty) values(12,330)
insert into #t1(sku_id,qty) values(12,110)
insert into #t1(sku_id,qty) values(15,120)
insert into #t1(sku_id,qty) values(15,500)
insert into #t1(sku_id,qty) values(15,520)
go
declare @i numeric(18,4)
update #t1 set @i =case when id in(select min(id) as id from #t1 group by sku_id) then qty else @i*0.4+ 0.6*qty end ,avg_qty = @i
select * from #t1
drop table #t1Top
10 楼rivery(river)回复于 2006-03-21 11:28:56 得分 50
/*1.这个语句的效率是不高的,但是楼主的问题应该是每条记录的avg_qty都需要进行更新的,不基于行计算,似乎没有更好的方法
2。仔细看看,应该是根据sku_id来填充的。原语句修改如下:
*/
declare @temp decimal(18,2)
declare @sku_id int
select @sku_id=0 --此值应该是sku_id中不可能出现的,楼主可实际修改。
update a
set @temp=case when @sku_id<>sku_id then qty
else @temp*0.4+qty*0.6 end,
avg_qty=@temp,
@sku_id=sku_id
from #t1 a
select * from #t1Top
11 楼rivery(river)回复于 2006-03-21 11:30:53 得分 0
--如果是计算所有的avg_qty,那么上面的语句应该是效率最高的了。Top
12 楼geniusli(纠级天使)回复于 2006-03-21 11:33:07 得分 0
不知道楼主想要什么样的方法实现?用递归可以吗?Top
13 楼gaojier1000(V2※高捷)回复于 2006-03-21 11:36:45 得分 0
技术能力不行,我只会用游标处理这样的需求!Top
14 楼happyflystone(无枪的狙击手)回复于 2006-03-21 11:37:51 得分 0
id sku_id qty avg_qty
----------- ----------- ----------- --------------------
1 12 200 200.00
2 12 130 158.00
3 12 330 261.20
4 12 110 170.48
5 15 120 120.00
6 15 500 348.00
7 15 520 451.20Top




