Tenho a seguinte estrutura, e estou fazendo uma SET
operação em uma CASE
cláusula mas está gerando um erro:
Sintaxe incorreta próxima
SET
Consulta:
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;
Seria melhor se houvesse outra maneira de armazenar o resultado da expressão em @TrendValue para que não houvesse necessidade de calcular essa expressão todas as vezes.
Também seria bom evitar erros de divisão por zero (é por isso que adicionei as várias R.TtlNOfCmpSale7to12 != 0
verificações).
Com base no seu comentário, você parece estar procurando uma maneira de evitar repetir o mesmo cálculo indefinidamente.
Você pode usar
APPLY VALUES
para calcular os valores necessários uma vez e, em seguida, usar a coluna com alias no restante de seus cálculos.Isso deve funcionar:
Ele usa IIF para definir TrendValue como 0 quando o divisor é igual a 0.
O CTE obtém todas as linhas da sua tabela e calcula os 3 valores de tendência. Você pode então SELECIONAR ou ATUALIZAR as colunas da tabela principal usada no CTE. Isso funciona como um UPDATE em uma VIEW.
Dados de amostra e saída são fornecidos abaixo.
Amostra:
Resultado: