水滴石穿

渴望成为高手--Amy.Qiu
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

SQL实现每种产品使用不同算法

Posted on 2008-05-13 18:02  AmyQiu  阅读(345)  评论(0编辑  收藏  举报

产品表
产品表ID(主键) 货名           金额         
1               电视           100
2               手机           150
3               衣服           50

库存表
库存表ID(主键)        产品表ID         打折                         货存     <-----货存表只有三种状态 0,1,2
1                       1             0.2                        1
2                       1             0.3                        1
3                       2             0.8                        0
4                       2             0.5                        1
5                       1             0.7                        1
6                       3             0.2                        2
6                       3             0.7                        1
6                       3             0.1                        0

我要得到以下结果

统计
产品表货名                       赢亏  <----计算                      是否打折       <-----只有三种状态 0,1,2
电视                100*(1+0.2)*(1+0.3)*(1+0.7)-100=165.2               1          <---当 库存表 的 [货存] 字段全部等于 1 时,那么 [是否打折]=1
手机                150-(150+150)=-150                                  0          <---当 库存表 的 [货存] 字段有一个为 0, 那么 [是否打折]=0
衣服                0                                                   2          <---当 库存表 的 [货存] 字段有一个为 2, 那么 [是否打折]=2

create table #a
(
 ProductID INT,
 Goods nvarchar(10),
 money int
)
insert into #a values(1,'电视',100)
insert into #a values(2,'手机',150)
insert into #a values(3,'衣服',50)

create table #b
(
 StorageID int,
 ProductID int,
 Discount decimal(10,2),
 ProductStorage int
)
insert into #b values(1,1,0.2,1)
insert into #b values(2,1,0.3,1)
insert into #b values(3,2,0.8,0)
insert into #b values(4,2,0.5,1)
insert into #b values(5,1,0.7,1)
insert into #b values(6,3,0.2,2)
insert into #b values(7,3,0.7,1)
insert into #b values(8,3,0.1,0)

select
    a.productid, a.goods as 产品表货名,
    盈亏=case when max(b.productstorage)=2 then 0 when min(b.productstorage)=0
 then min(a.money)-sum(a.money)
 else min(a.money)*exp(sum(log(1+b.discount)))-min(a.money) end,
    是否打折=case when max(b.productstorage)=2 then 2 when min(b.productstorage)=0 then 0 else 1 end
from #a a inner join #b b
on a.productid=b.productid
group by a.productid, a.goods