PostgreSQL Управление значениями с помощью индексов столбцов - PullRequest
0 голосов
/ 29 августа 2018

У меня довольно странная проблема, я не могу найти решение для реализации.

У меня есть таблица для переформатирования, как показано ниже:

+-------+-------+-------+-------+-------+-------+---------+
| Col_1 | Col_2 | Col_3 | Col_4 | Col_5 | Col_6 | Formula |
+-------+-------+-------+-------+-------+-------+---------+
| x     | x     | x     | x     | x     | x     |         |
|       | y     |       | y     | y     | y     |       4 |
|       | z     | z     | z     | z     |       |       2 |
| t     | t     | t     | t     | t     | t     |       5 |
| m     | m     | m     |       |       |       |       5 |
+-------+-------+-------+-------+-------+-------+---------+

x, y, z и t являются числовыми значениями, и считается, что в каждой строке эти значения либо точно такие же, либо пустые. А в другом столбце мне дан индекс столбца для манипуляции.

Затем, в представлении, мне нужно преобразовать эту таблицу в нечто вроде ниже:

+-------+-------+-------+-------+-------+-------+---------+
| Col_1 | Col_2 | Col_3 | Col_4 | Col_5 | Col_6 | Formula |
+-------+-------+-------+-------+-------+-------+---------+
| x     | x     | x     | x     | x     | x     |         |
|       |       |       | 2*y   | y     | y     |       4 |
|       | z     | z     | z     | z     |       |       2 |
|       |       |       |       | 5*t   | t     |       5 |
|       |       |       |       | 3*m   |       |       5 |
+-------+-------+-------+-------+-------+-------+---------+

Другими словами, мне нужно удалить (или заменить на 0, поскольку значения не должны включаться в суммы столбцов) значения столбцов до индекса, указанного в столбце формулы, а затем добавить сумму этих удаленных значений в указанный индекс. Например, в последней строке столбцы 1-5 удаляются и добавляются в столбец 5.

столбцы буквально называются col_1 и т. Д., Поэтому возможны даже строковые операции, но я не уверен, является ли это хорошим способом решения этой проблемы.

Я вообще не знаю, как решить эту проблему, поэтому любая помощь приветствуется. Большое спасибо заранее.

1 Ответ

0 голосов
/ 29 августа 2018

Вы можете написать CASE выражений, которые либо возвращают NULL, либо сумму предыдущих полей и текущего, умноженную на formula, либо исходное значение столбца в зависимости от formula.

SELECT CASE
         WHEN formula < 1 THEN
           NULL
         WHEN formula = 1 THEN
           (coalesce(col_1, 0)) * formula
         ELSE
           col_1
       END col_1,
       CASE
         WHEN formula < 2 THEN
           NULL
         WHEN formula = 2 THEN
           (coalesce(col_1, 0)
            + coalesce(col_2, 0)) * formula
         ELSE
           col_2
       END col_2,
       ...
       CASE
         WHEN formula < 6 THEN
           NULL
         WHEN formula = 6 THEN
           (coalesce(col_1, 0)
            + coalesce(col_2, 0)
            + coalesce(col_3, 0)
            + coalesce(col_4, 0)
            + coalesce(col_5, 0)
            + coalesce(col_6, 0)) * formula
         ELSE
           col_6
       END col_6,
       formula
       FROM elbat;

(Примечание: для col_1 это можно упростить, но, как оно стоит, оно больше подчеркивает рисунок.)

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