Можно ли создавать столбцы на основе входных столбцов в PostgreSQL - PullRequest
0 голосов
/ 19 марта 2020

Надеюсь, у вас сейчас все хорошо. У меня есть следующая проблема, и я буду очень признателен за ваши советы и поддержку:

[Дано] У меня есть такая таблица в PostgreSQL с 3 начальными столбцами, называемыми Project, size и StartDate (см. Ниже) :

Проект ---- / ---- Размер - / ---- Начальная дата

Проект1 --- / ----- 88 --- / --- -2020-06-15

Project2 --- / ----- 105 --- / --- 2020-03-01

Мне нужно добавить 12 столбцов рядом с StartDate столбец и расширение исходной таблицы до 15 столбцов . Все новые столбцы представляют месяцы для данного года (2020), и они будут содержать 0 и значения, рассчитанные на основе условных логик c, полученных из столбцов Size и StartDate. Условие следующее: , если StartDate принадлежит определенному c месяцу, этот месяц получает значение = Размер , и после этого для каждого следующего месяца Значение = Значение-50 до Значения> 0. Пожалуйста, проверьте ожидаемый результат ниже:

Проект ---- / ---- Размер - / ---- StartDate-- / --- Янв - / - Фев - / - Март - / - апрель - / - Май / - июнь - / - июль ---- / - август - / - Сентябрь - / - октябрь - / - Nov- - / - De c - /

Project1 --- / ----- 88 --- / ---- 2020-05-15 / --- 0 --- / --- 0 ---- // --- 0 --- // ---- 0 --- // --- 88 - // --- 38 - // --- 0- --- // --- 0 ---- // --- 0 ---- / --- 0 ---- // --- 0 ---- / --- 0 --- - /

Project2 --- / ----- 105 --- / --- 2020-03-01 / --- 0 --- / --- 0 ---- // -105 - // --- 55 --- // --- 5 --- // --- 0 ---- // --- 0 ---- // --- 0 --- - // --- 0 ---- / --- 0 ---- // --- 0 ---- / --- 0 ---- /

Я надеюсь, что смогу объясни мою проблему. Буду благодарен за любые советы и поддержку, которыми вы можете поделиться со мной.

Большое спасибо заранее.

1 Ответ

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

Это можно сделать с помощью множества CASE выражений:

SELECT project,
       size,
       startdate,
       CASE WHEN mon < 2
            THEN greatest(size - 50 * (1 - mon), 0)
            ELSE 0
       END AS jan,
       CASE WHEN mon < 3
            THEN greatest(size - 50 * (2 - mon), 0)
            ELSE 0
       END AS feb,
       CASE WHEN mon < 4
            THEN greatest(size - 50 * (3 - mon), 0)
            ELSE 0
       END AS mar,
       CASE WHEN mon < 5
            THEN greatest(size - 50 * (4 - mon), 0)
            ELSE 0
       END AS apr,
       CASE WHEN mon < 6
            THEN greatest(size - 50 * (5 - mon), 0)
            ELSE 0
       END AS may,
       CASE WHEN mon < 7
            THEN greatest(size - 50 * (6 - mon), 0)
            ELSE 0
       END AS jun,
       CASE WHEN mon < 8
            THEN greatest(size - 50 * (7 - mon), 0)
            ELSE 0
       END AS jul,
       CASE WHEN mon < 9
            THEN greatest(size - 50 * (8 - mon), 0)
            ELSE 0
       END AS aug,
       CASE WHEN mon < 10
            THEN greatest(size - 50 * (9 - mon), 0)
            ELSE 0
       END AS sep,
       CASE WHEN mon < 11
            THEN greatest(size - 50 * (10 - mon), 0)
            ELSE 0
       END AS oct,
       CASE WHEN mon < 12
            THEN greatest(size - 50 * (11 - mon), 0)
            ELSE 0
       END AS nov,
       CASE WHEN mon < 13
            THEN greatest(size - 50 * (12 - mon), 0)
            ELSE 0
       END AS dec
FROM (SELECT project,
             size,
             startdate,
             extract(month FROM startdate) AS mon
      FROM mytable) AS q;
...