开发者社区> 问答> 正文

是否可以根据PostgreSQL中的输入列生成列

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

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

项目---- / ----大小-/ ---- StartDate

项目1 --- / ----- 88 --- / ---- 2020-06-15

项目2 --- / ----- 105 --- / --- 2020-03-01

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

项目---- / ----大小-/ ----开始日期-/-一月-/-二月-/-三月-/-四月-/-麦/-六月-/-七月---- /-八月-/-九月-/-十月-/-十一月-/-十二月-/

项目1 --- / ----- 88 --- / ---- 2020-05-15 / --- 0 --- / --- 0 ---- // --- 0 --- // ---- 0 --- // --- 88-// --- 38-// --- 0 ---- // --- 0 ---- //- -0 ---- / --- 0 ---- // --- 0 ---- / --- 0 ---- /

项目2 --- / ----- 105 --- / --- 2020-03-01 / --- 0 --- / --- 0 ---- //-105-//- 55-// --- 5 --- // --- 0 ---- // --- 0 ---- // --- 0 ---- // --- 0- --- / --- 0 ---- // --- 0 ---- / --- 0 ---- /

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

提前谢谢了。

问题来源:stackoverflow

展开
收起
is大龙 2020-03-21 18:10:01 439 0
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;
    

    回答来源:stackoverflow

    2020-03-21 18:10:19
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
认识PostgreSQL中与众不同的索引 立即下载
为什么PostgreSQL是最适合去O的数据库 立即下载
PolarDB for PostgreSQL三节点功能介绍 立即下载

相关镜像