是否有可能基于PostgreSQL中的输入列生成列

问题描述 投票:0回答:1

我希望您最近过得很好。我遇到以下问题,非常感谢您的建议和支持:

[给出]我在PostgreSQL中有一个这样的表,其中有3个初始列,分别称为Project,size和StartDate(见下文):

项目---- / ----大小-/ ----起始日期

Project1 --- / ----- 88 --- / ---- 2020-06-15

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

我需要在StartDate列旁边添加[[[[12 [column],并将初始表扩展到15列。所有新列均表示给定年份(2020)的月份,并且它们将包含0和根据从Size和StartDate列派生的条件逻辑计算的值。条件如下:如果StartDate属于特定月份,则该月份获得一个值= Size,然后在下一个月中,每个下个月取Value = Value-50,直到Value> 0。请检查以下预期结果:

项目---- / ----大小-/ ----开始日期-/ ---一月-/-二月-/-三月-/-四月-/- -Mai /-Jun-/-Jul ---- /-Aug-/-Sep-/-Oct-/-Nov-/-Dec-/

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 ---- /

我希望我能解释我的问题。感谢您可以与我分享的任何建议和支持。

非常感谢。

python-3.x postgresql calendar conditional-statements series
1个回答
0
投票

这可以通过许多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;
© www.soinside.com 2019 - 2024. All rights reserved.