0

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

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

我很欣赏可以提供的任何见解。我想这是以前做过的,但我的搜索没有产生任何命中。

4

2 回答 2

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

应该做的伎俩

于 2013-11-14T21:20:17.980 回答
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)
于 2013-11-14T21:27:23.740 回答