Как выполнить расчет в заданном столбце c с несколькими условиями - PullRequest
0 голосов
/ 16 марта 2020

Я ищу чистое решение для расчета из одного столбца с несколькими условиями и вставки его в ту же таблицу. Мое существующее решение - использовать 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, так как он довольно длинный, но я надеюсь, что вы поймете его суть .

1 Ответ

0 голосов
/ 16 марта 2020

Разве это не так просто, как INSERT и SUM ..?

INSERT INTO dbo.YourTable ([Week],Indicator,[Value])
SELECT YT.[Week],
       'C' AS Indicator,
       SUM(YT.[Value]) AS [Value]
FROM dbo.YourTable YT
GROUP BY YT.[Week];

DB <> Fiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...