Я ищу чистое решение для расчета из одного столбца с несколькими условиями и вставки его в ту же таблицу. Мое существующее решение - использовать while l oop со многими объявлениями переменных, писать простой запрос для сохранения значения, выполнять вычисления и, наконец, вставлять его как новую строку в таблицу. Однако это выглядит грязно и сложно. Мне интересно, есть ли лучшее решение для этого?
Исходная таблица
Week | Indicator | Value
1 A 2
1 B 3
1 D 10
1 E 5
1 X 12
1 Y 6
2 A 4
2 B 5
2 D 7
2 E 3
2 X 4
2 Y 2
...
53
Обновленная таблица
Week | Indicator | Value
1 A 2
1 B 3
1 C 5
1 D 10
1 E 5
1 F 5
1 X 12
1 Y 6
1 Z 2
2 A 4
2 B 5
2 C 9
2 D 7
2 E 3
2 F 4
2 X 4
2 Y 2
2 Z 2
В этом примере в обновленной таблице каждая третья строка содержит различные вычисления для на той же неделе, что 3-й ряд - это сложение, 6-й ряд - вычитание, а 9-й ряд - деление.
Расчет не ограничивается только сложением и может включать другие формы формул расчета. Я просто использую дополнение в качестве простой иллюстрации.
Вот пример моего SQL решения:
DECLARE @total_rows int;
SET @total_rows = (SELECT COUNT(*) FROM original_table);
DECLARE @wk varchar(5);
DECLARE @indicator1 char(1);
DECLARE @indicator2 char(1);
SET @indicator1 = 'A';
SET @indicator2 = 'B';
DECLARE @a_value int;
DECLARE @b_value int;
DECLARE @cal_value int;
DECLARE @iteration int
SET @iteration = 1
WHILE @iteration <= @total_rows
BEGIN
IF @iteration <= 53
SET @wk = concat('W',@iteration)
SET @a_value = (SELECT value
FROM original_table
WHERE indicator = @indicator1 and week = @wk);
SET @b_value = (SELECT value
FROM original_table
WHERE indicator = @indicator2 and week = @wk);
SET @cal_value = (@a_value/ NULLIF(@b_value,0)) *1000000;
....
SET @iteration = @iteration + 1
END
Не собираюсь публиковать весь сценарий SQL, так как он довольно длинный, но я надеюсь, что вы поймете его суть .