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)

これら 2 つの製品の望ましい出力は次のとおりです。

製品 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

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 に答える