У меня возникли проблемы с подходом CTE к выполнению задачи.У меня уже есть метод цикла, и он достаточно быстрый, но я хотел сделать его надлежащим образом, чтобы лучше изучить и понять использование CTE.
SQL:
DECLARE @Income MONEY=125000.00,
@Active INT=0,
@Year CHAR(4)='2018'
DECLARE @T TABLE ([Year] CHAR(4),Active INT,UpperLimit MONEY,Factor DECIMAL(6,3))
INSERT INTO @T ([Year],Active,UpperLimit,Factor) SELECT '2018',0,5000.0,1.00;
INSERT INTO @T ([Year],Active,UpperLimit,Factor) SELECT '2018',0,100000.0,0.85;
INSERT INTO @T ([Year],Active,UpperLimit,Factor) SELECT '2018',0,500000.0,0.80;
INSERT INTO @T ([Year],Active,UpperLimit,Factor) SELECT '2018',0,999999999.0,0.75;
WITH GradientCTE ([Year], Active, UpperLimit, Factor,[Income],WeightedValue,[Row])
AS
(
SELECT [Year], Active, UpperLimit, Factor
,@Income AS [Income]
,CAST(0.0 AS DECIMAL(16,3))AS WeightedValue
,ROW_NUMBER() OVER(PARTITION BY [Year],Active ORDER BY UpperLimit ASC) AS [Row]
From @T
)
SELECT *
FROM GradientCTE
ORDER BY UpperLimit
TLDR версия;токовый выход:
Year Active UpperLimit Factor Income WeightedValue Row
2018 0 5000.000 1.000 125000.000 0.000 1
2018 0 100000.000 0.850 125000.000 0.000 2
2018 0 500000.000 0.800 125000.000 0.000 3
2018 0 999999999.000 0.750 125000.000 0.000 4
Что бы я хотел:
Year Active UpperLimit Factor Income WeightedValue Row
2018 0 5000.000 1.000 125000.000 5000.000 1
2018 0 100000.000 0.850 120000.000 85000.000 2
2018 0 500000.000 0.800 20000.000 16000.000 3
2018 0 999999999.000 0.750 0.000 0.000 4
Объяснено :
В настоящее время логика цикла проходит по заданной строкепо строке и уменьшает @Income на UpperLimit для каждой строки, пока не останется денег.Он использует это, чтобы умножить эту сумму на коэффициент, чтобы получить взвешенную сумму.Итак, в приведенном примере начальный доход составляет 125 000,00.Первые 5000 имеют полный вес (1,00), поэтому мы уменьшаем доход на 5000 и перемещаем следующий ряд, сохраняя итоговое взвешенное значение.Это делается до тех пор, пока доход не станет равным 0. Таким образом, 125 000 должны выйти на (5000 * 1,0) + (100000 * 0,85) + (20000 * 0,80) + (0,00 * 0,75) или на сумму 106 000, если их суммировать.