【发布时间】:2012-05-10 13:53:37
【问题描述】:
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 不是表格中的一列,我只是为了清楚起见而添加,但CTE 会通过比较A、B 与C 和D 自动推断
对于级别 1,计算将是
Calc1 = (F + G - H)
Calc2 = Calc1 + G + H
2级及以上计算公式为
Calc1 = (上一级的Calc2) / 100的总和
Calc2 = Calc1 + G + H - 无论级别如何,此计算都没有变化
The calculation is cyclic - Level 2 的计算结果需要反馈到 Level 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 或其他东西..
【问题讨论】:
-
尝试在那里使用层而不是层
-
谢谢,打错了,已更新
-
如果我理解你的问题,你不需要
SUM()。您只需通过在 CTE 的后半部分添加这些值来累积这些值。Level不是SUM(),它是一系列添加的总和。 -
@user92546 抱歉没看懂你的回答,能告诉我怎么累积吗?我需要该值以及累积的 SUM。
-
@Humble - 您真的想要上一层的 所有 行的
SUM(),还是只想要一行?第一种情况是一个挑战,第二种情况就像Level:Tiers.Calc1 + ( G + H ) / 100一样处理。您的Calc1定义中有错字吗?描述是指Calc2的总和,但代码使用'Calc1'。
标签: sql sql-server sql-server-2008 tsql common-table-expression