【请教】一个产品平均打折的问题...

outwindows 2004-07-16 09:37:58
产品价格表:
----------------------------------------------------
产品名称 最低价  最高价 最低打折率(%) 订价
P1 110 300 36.67
P2 150 250 60.00
P3 100 200 50.00
P4 120 300 40.00
总计 480 1050
--------------------------------------------------
实际价格600,最高价1050,所以实际总打折率600/1050 = 0.5714,那么订价=最高价

*0.5714:
产品名称 最低价  最高价 最低打折率(%) 打折(%) 订价
P1 110 300 36.67 57.14 171.42
P2 150 250 60.00 57.14 142.85
P3 100 200 50.00 57.14 114.28
P4 120 300 40.00 57.14 171.42
--------------------------------------------------
但是这样一来,产品P2的打折过低,订价低于了最低价,需重新进行筛选,先把P2订价设为

最低价(即150),再以同样的算法去算其它产品的订价:
其它产品的实际价格为600-150=450,其它产品的最高价为1050-250=800,
这样又以实际价格450,最高价800为基础按相同的方法去算剩余3个产品的订价:
--------------------------------------------------
产品名称 最低价  最高价
P2 150 250
...全文
401 63 打赏 收藏 转发到动态 举报
写回复
用AI写文章
63 条回复
切换为时间正序
请发表友善的回复…
发表回复
outwindows 2004-07-16
  • 打赏
  • 举报
回复
的确有问题...
leeboyan 2004-07-16
  • 打赏
  • 举报
回复
真有钱
outwindows 2004-07-16
  • 打赏
  • 举报
回复
试试...
zjcxc 元老 2004-07-16
  • 打赏
  • 举报
回复
--这样的数据,实际价格为500来计算,outwindows(窗外) 的方法不对

INSERT [BAS_PRODUCT] ( [BAS_ID] , [BAS_NAME] , [MIN_PRICE] , [MAX_PRICE] ) VALUES ( 1 , 'P1' , 100.0 , 450.0 )
INSERT [BAS_PRODUCT] ( [BAS_ID] , [BAS_NAME] , [MIN_PRICE] , [MAX_PRICE] ) VALUES ( 2 , 'P2' , 100.0 , 350.0 )
INSERT [BAS_PRODUCT] ( [BAS_ID] , [BAS_NAME] , [MIN_PRICE] , [MAX_PRICE] ) VALUES ( 3 , 'P3' , 100.0 , 250.0 )
INSERT [BAS_PRODUCT] ( [BAS_ID] , [BAS_NAME] , [MIN_PRICE] , [MAX_PRICE] ) VALUES ( 4 , 'P4' , 100.0 , 150.0 )
zjcxc 元老 2004-07-16
  • 打赏
  • 举报
回复
outwindows(窗外) 的方法不对.
outwindows 2004-07-16
  • 打赏
  • 举报
回复
declare @p float
set @p = 600
--1.先将产品打折率高于总的打折率的产品设为最低价
update bas_product set order_price=min_price
where min_price/max_price>(@p/(select sum(max_price) from bas_product))

--2.其它再平均
update bas_product set order_price=max_price*(@p-(select sum(order_price) from bas_product))/((select sum(max_price) from bas_product where isnull(order_price,0)=0))
where isnull(order_price,0)=0

--验证
select sum(ORDER_PRICE) from BAS_PRODUCT
select * from BAS_PRODUCT
select *,100*MIN_PRICE/Max_PRICE as [最低打折率(%)],100*ORDER_PRICE/Max_PRICE as [打折(%)] from BAS_PRODUCT
Tongls 2004-07-16
  • 打赏
  • 举报
回复
这个算法可以用公式写出来,

实际总打折率=(总产品记录数*定价数 -全部产品的最低价)/(全部产品的最高价之和*(总产品记录数-1)

即=(4*600-480)/(1050*(4-1))=0.609

就可记算出其它产品
zjcxc 元老 2004-07-16
  • 打赏
  • 举报
回复
--测试数据
if object_id('BAS_PRODUCT') is not null
DROP TABLE [BAS_PRODUCT]
CREATE TABLE [BAS_PRODUCT]( [BAS_ID] [int] IDENTITY (1, 1) NOT NULL , [BAS_NAME] [varchar] (20) NULL , [MIN_PRICE] [float] NULL , [MAX_PRICE] [float] NULL , [ORDER_PRICE] [float] NULL )
ALTER TABLE [BAS_PRODUCT] WITH NOCHECK ADD CONSTRAINT [PK_BAS_PRODUCT] PRIMARY KEY NONCLUSTERED ( [BAS_ID] )

SET IDENTITY_INSERT [BAS_PRODUCT] ON

INSERT [BAS_PRODUCT] ( [BAS_ID] , [BAS_NAME] , [MIN_PRICE] , [MAX_PRICE] ) VALUES ( 1 , 'P1' , 110.0 , 300.0 )
INSERT [BAS_PRODUCT] ( [BAS_ID] , [BAS_NAME] , [MIN_PRICE] , [MAX_PRICE] ) VALUES ( 2 , 'P2' , 150.0 , 250.0 )
INSERT [BAS_PRODUCT] ( [BAS_ID] , [BAS_NAME] , [MIN_PRICE] , [MAX_PRICE] ) VALUES ( 3 , 'P3' , 100.0 , 200.0 )
INSERT [BAS_PRODUCT] ( [BAS_ID] , [BAS_NAME] , [MIN_PRICE] , [MAX_PRICE] ) VALUES ( 4 , 'P4' , 120.0 , 300.0 )

SET IDENTITY_INSERT [BAS_PRODUCT] OFF
go

--计算的存储过程
create proc p_calc
@all_order_price float=600,
@reset bit=1 --是否重新初始化 ORDER_PRICE 的值
as
declare @avg_price float

if @reset=0 update BAS_PRODUCT set ORDER_PRICE=null
--实际上,如果 ORDER_PRICE 默认值设置为 0,这里更新为0的话,效率会更高
--当然,如果默认值设置为0的话,则下面所有的条件中,将 is null 换成=0

select @avg_price=@all_order_price/sum(MAX_PRICE)
from BAS_PRODUCT
where ORDER_PRICE is null --只计算没有值的,这样可以在某个结果的基础上再算

update BAS_PRODUCT set ORDER_PRICE=MIN_PRICE
,@all_order_price=@all_order_price-MIN_PRICE
where ORDER_PRICE is null
and MIN_PRICE/MAX_PRICE>@avg_price
while @@rowcount>0
begin
select @avg_price=@all_order_price/sum(MAX_PRICE)
from BAS_PRODUCT
where ORDER_PRICE is null --只计算没有值的,这样可以在某个结果的基础上再算

update BAS_PRODUCT set ORDER_PRICE=MIN_PRICE
,@all_order_price=@all_order_price-MIN_PRICE
where ORDER_PRICE is null
and MIN_PRICE/MAX_PRICE>@avg_price
end
if @all_order_price>0
update BAS_PRODUCT set ORDER_PRICE=MAX_PRICE*@avg_price
where ORDER_PRICE is null
go

--调用存储过程进行计算
exec p_calc
go

--显示计算结果
select * from BAS_PRODUCT
go

--删除测试
drop proc p_calc
DROP TABLE [BAS_PRODUCT]

/*--测试结果

BAS_ID BAS_NAME MIN_PRICE MAX_PRICE ORDER_PRICE
----------- -------------------- ------------ ------------ -------------
1 P1 110.0 300.0 168.75
2 P2 150.0 250.0 150.0
3 P3 100.0 200.0 112.5
4 P4 120.0 300.0 168.75

(所影响的行数为 4 行)
--*/
zjcxc 元老 2004-07-16
  • 打赏
  • 举报
回复
--计算的存储过程
create proc p_calc
@all_order_price float=600,
@reset bit=1 --是否重新初始化 ORDER_PRICE 的值
as
declare @avg_price float

if @reset=0 update BAS_PRODUCT set ORDER_PRICE=null
--实际上,如果 ORDER_PRICE 默认值设置为 0,这里更新为0的话,效率会更高
--当然,如果默认值设置为0的话,则下面所有的条件中,将 is null 换成=0

select @avg_price=@all_order_price/sum(MAX_PRICE)
from BAS_PRODUCT
where ORDER_PRICE is null --只计算没有值的,这样可以在某个结果的基础上再算

update BAS_PRODUCT set ORDER_PRICE=MIN_PRICE
,@all_order_price=@all_order_price-MIN_PRICE
where ORDER_PRICE is null
and MIN_PRICE/MAX_PRICE>@avg_price
while @@rowcount>0
begin
select @avg_price=@all_order_price/sum(MAX_PRICE)
from BAS_PRODUCT
where ORDER_PRICE is null --只计算没有值的,这样可以在某个结果的基础上再算

update BAS_PRODUCT set ORDER_PRICE=MIN_PRICE
,@all_order_price=@all_order_price-MIN_PRICE
where ORDER_PRICE is null
and MIN_PRICE/MAX_PRICE>@avg_price
end
if @all_order_price>0
update BAS_PRODUCT set ORDER_PRICE=MAX_PRICE*@avg_price
where ORDER_PRICE is null
go

--调用存储过程进行计算
exec p_calc
zjcxc 元老 2004-07-16
  • 打赏
  • 举报
回复
而且,照你的算法,就出现pbsql所说的:

第一次将打折高过平均折扣的产品筛选出来,再在剩余的产品中重新筛选...这样依次筛选下去总会有打折高过平均折扣的产品,岂不是全都筛选出来了?
zjcxc 元老 2004-07-16
  • 打赏
  • 举报
回复
那会不会减出负数来?
outwindows 2004-07-16
  • 打赏
  • 举报
回复
有多个产品就减多个产品的实际价格...
zjcxc 元老 2004-07-16
  • 打赏
  • 举报
回复
我知道,我是问你实际价格是怎么出?

只有一个产品的时候
其它产品的实际价格为600-150=450

有多个产品的时候,减什么值?
outwindows 2004-07-16
  • 打赏
  • 举报
回复
这样:1.先将产品打折率高于总的打折率的产品设为最低价
2.其它再平均
outwindows 2004-07-16
  • 打赏
  • 举报
回复
出现这种的有多个产品的话,那就把这些产品的价格都设为最低价先,再处理其它产品...
zjcxc 元老 2004-07-16
  • 打赏
  • 举报
回复
产品P2的打折过低,订价低于了最低价

如果出现这种的有多个产品,取那个产品的价格来得到实际价?
outwindows 2004-07-16
  • 打赏
  • 举报
回复
最低打折率(%)=(最低价/最高价)*100
outwindows 2004-07-16
  • 打赏
  • 举报
回复
最低价加一个比例?
zjcxc 元老 2004-07-16
  • 打赏
  • 举报
回复
怎么给出的测试表没有 最低打折率(%) 的?
i9988 2004-07-16
  • 打赏
  • 举报
回复
加多点数据测试
加载更多回复(43)

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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