将多个百分比应用于列

时间:2013-11-14 21:06:25

标签: sql sql-server tsql

我知道我可以使用游标,但我正在尝试用理想的基于集合的解决方案或者CTE来编写它。我有2个表(简化为帖子),产品 - 每个都有一个基本价格,然后是一个修饰符表,这是一个百分比增加,以连续应用于该价格。因此,如果一个产品有2%,即4%和5%,我不能只将基价提高9%,要求是将基价提高4%,然后将结果提高5% 。这可能发生一次到多次。以下是我到目前为止的情况:

CREATE TABLE #Product
(ProdID INT,
BasePrice MONEY)

INSERT INTO #Product
VALUES
(1, 10), (2, 20)

CREATE TABLE #Modifiers
(ProdID INT,
ModPercent INT)

INSERT INTO #Modifiers
VALUES
(1, 2), (1,5), (2, 2), (2, 3), (2,5)

这两种产品的理想输出是:

产品1((10 * 1.02)* 1.05)= 10.71 产品2(((20 * 1.02)* 1.03)* 1.05)= 22.0626

我尝试在直接查询中弄乱EXP(SUM(LOG())),但似乎我总是总结百分比。我也尝试了一个CTE,但我似乎无法通过无限递归得到它:

WITH ProductOutput (ProdID, SumPrice) AS 
(
    SELECT ProdID, BasePrice
    FROM #Product 

    UNION ALL
    SELECT P.ProdID, CAST(O.SumPrice * (1 + (M.ModPercent / 100.00)) AS MONEY)
    FROM #Product P
    INNER JOIN #Modifiers M ON 
    P.ProdID = M.ProdID
        INNER JOIN ProductOutput AS O
        ON P.ProdID = O.ProdID 

)
SELECT ProdID, SUM(SumPrice)
FROM ProductOutput
GROUP BY ProdID

我感谢任何可以提供的见解。我想这之前已经完成了,但我的搜索没有产生任何命中。

2 个答案:

答案 0 :(得分:2)

select ProdId, EXP(SUM(LOG(ModPercent/100+1)))*AVG(BasePrice)
from Product
join Modifiers using(ProdId) 
group by ProdId

应该做的伎俩

答案 1 :(得分:2)

SQL 2005添加了Outer Apply - 让很多复杂的SQL更清晰 - 显然没必要,因为Group By在这里提供了关键的洞察力 - 但是当你为“连接逻辑”添加条件时它值得学习宝贵的

select P.ProdID
  , ML.logmarkup
  , P.BasePrice 
  , P.BasePrice * exp(ML.logmarkup) as NewPrice
from #Product P
outer apply 
( 
  select sum(log(1.0+M.ModPercent/100.0)) as logmarkup
  from #Modifiers M where (M.ProdID = P.ProdID)
  group by M.ProdID
) ML

ProdID      logmarkup              BasePrice             NewPrice
----------- ---------------------- --------------------- ----------------------
1           0.0685927914656118     10.00                 10.71
2           0.0981515937071562     20.00                 22.0626

(2 row(s) affected)