我知道我可以使用游标,但我正在尝试用理想的基于集合的解决方案或者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
我感谢任何可以提供的见解。我想这之前已经完成了,但我的搜索没有产生任何命中。
答案 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)