我有以下结构,我SET
在一个子句中进行操作,CASE
但它产生了一个错误:
附近的语法不正确
SET
询问:
DECLARE @tbl_Result TABLE
(
RowID INT IDENTITY(1,1),
TtlNOfCmpSale7to12 INT,
TtlNOfCmpSale4to6 INT,
TtlNOfCmpSale0to3 INT,
TtlNOfCmpSaleSpanFirst SMALLINT DEFAULT 0,
TtlNOfCmpSaleSpanSecond SMALLINT DEFAULT 0,
TtlNOfCmpSaleSpanThird SMALLINT DEFAULT 0
);
DECLARE
@Declining FLOAT,
@StableStart SMALLINT,
@StableEnd SMALLINT,
@Increasing SMALLINT;
SELECT
@Declining = 0.90,
@StableStart = 90,
@StableEnd = 110,
@Increasing = 110;
DECLARE @TrendValue FLOAT;
UPDATE R
SET R.TtlNOfCmpSaleSpanFirst =
CASE
WHEN R.TtlNOfCmpSale7to12 != 0 THEN
SET @TrendValue = R.TtlNOfCmpSale4to6*2/R.TtlNOfCmpSale7to12
(
CASE
WHEN @TrendValue > @Increasing THEN 0
WHEN @TrendValue > @StableStart
AND @TrendValue < @StableEND THEN 1
WHEN @TrendValue < @Declining THEN 2
END
)
END,
R.TtlNOfCmpSaleSpanSecond =
CASE
WHEN R.TtlNOfCmpSale4to6!= 0 THEN
SET @TrendValue = R.TtlNOfCmpSale0to3/R.TtlNOfCmpSale4to6
(
CASE
WHEN @TrendValue > @Increasing THEN 0
WHEN @TrendValue > @StableStart
AND @TrendValue < @StableEND THEN 1
WHEN @TrendValue < @Declining THEN 2
END
)
END,
R.TtlNOfCmpSaleSpanThird =
CASE
WHEN R.TtlNOfCmpSale7to12 != 0 THEN
SET @TrendValue = R.TtlNOfCmpSale0to3/R.TtlNOfCmpSale7to12
(
CASE
WHEN @TrendValue > @Increasing THEN 0
WHEN @TrendValue > @StableStart
AND @TrendValue < @StableEND THEN 1
WHEN @TrendValue < @Declining THEN 2
END
)
END
FROM Result R;
如果有另一种方法将表达式的结果存储到@TrendValue 中,这样就无需每次都计算该表达式。
避免除以零错误也很好(这就是我添加各种R.TtlNOfCmpSale7to12 != 0
检查的原因)。
根据您的评论,您似乎正在寻找一种方法来避免一遍又一遍地重复相同的计算。
您可以使用
APPLY VALUES
一次来计算所需的值,然后在其余计算中使用别名列。这应该有效:
当分频器等于 0 时,它使用IIF将 TrendValue 设置为 0。
CTE 从您的表中获取所有行并计算 3 个趋势值。然后,您可以从中选择或更新 CTE 中使用的主表中的列。这就像视图中的更新一样。
示例数据和输出如下所示。
样本:
输出: