【问题标题】:Is it possible to generate columns based on input columns in PostgreSQL是否可以根据 PostgreSQL 中的输入列生成列
【发布时间】:2020-03-19 15:17:33
【问题描述】:

我在 PostgreSQL 中有一个这样的表,其中包含 3 个初始列,分别称为 ProjectSizeStartDate(见下文):

Project Size StartDate
Project1 88 2020-06-15
Project2 105 2020-03-01

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

Project Size StartDate Jan Feb Mar Apr Mai Jun Jul Aug Sep Oct Nov Dec
Project1 88 2020-06-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】:

    这可以通过很多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;
    

    【讨论】:

    • 非常感谢您提出这个好主意。它完美地工作。如果您能考虑并帮助修改此问题,将不胜感激。是否可以连续两次获得初始值然后进行减法。在 Project1 的情况下,该行将如下所示:0,0,0,0, 88, 88,38, 0,0,0,0,0
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-14
    • 2020-08-12
    • 1970-01-01
    相关资源
    最近更新 更多