TableX
列と値を使用
A B C D E F G H Level
---------------------------------------------------------------------
10 ABC 10 ABC XYZ 2 3 4 1
10 ABC 10 ABC XYZ 2 3 4 1
11 DEF 10 ABC XYZ 4 5 6 2
11 DEF 10 ABC XYZ 6 7 8 2
12 GHI 11 DEF XYZ 7 8 9 3
12 GHI 11 DEF XYZ 8 9 10 3
15 JKL 15 JKL ABC 9 10 11 1
15 JKL 15 JKL ABC 10 11 12 1
16 MNO 15 JKL ABC 13 14 15 2
16 MNO 15 JKL ABC 16 16 18 2
ここでLevel
は、テーブルの列ではありません。わかりやすくするために追加しましたが、A、B を C および D と比較することにより、CTE によって自動的に推測されます。
レベル 1 の場合、計算は次のようになります。
Calc1 = (F + G - H)
Calc2 = Calc1 + G + H
レベル2以降の計算式は
Calc1 = (以前のレベルの Calc2) の合計 / 100
Calc2 = Calc1 + G + H - レベルに関係なく、この計算に変更はありません
The calculation is cyclic
- レベル 2 の計算結果は、レベル 3 の計算などに入力する必要があります。
WITH Tiers (
Level,
A,
B,
C,
D,
E,
Calc1,
Calc2)
AS
SELECT 1 AS Level,
A,
B,
C,
D,
E,
F + G - H AS Calc1,
(F + G - H) + G + H AS Calc2
FROM TableX
WHERE A = C
AND B = D
UNION ALL
SELECT tier.Level + 1 AS Level,
A,
B,
C,
D,
E,
/* How can I do this SUM (tier.Calc1) / 100 */
/* How can I do this SUM (tier.Calc1) / 100 + G + H */
FROM TableX tab
INNER JOIN Tiers tier
ON tab.C = tier.A
AND tab.D = tier.B
AND tab.E = tier.E
WHERE (A <> C
OR B <> D)
)
SELECT *
FROM Tiers
私は試した
SELECT tier.Level + 1 AS Level,
A,
B,
C,
D,
E,
sumCalc.calc1 / 100 Calc1
sumCalc.calc1 / 100 + G + H Calc2
FROM TableX tab
INNER JOIN Tiers tier
ON tab.C = tier.A
AND tab.E = tier.B
INNER JOIN (
SELECT A, B, E, SUM(Calc1) Calc1
FROM Tiers
GROUP BY A, B, E) sumCalc /* SQL Server throws error that CTE table cannot be used here */
WHERE (A <> C
OR B <> D)
また、テーブル値の OUTER APPLY などを使用することも考えています..