我希望您最近过得很好。我遇到以下问题,非常感谢您的建议和支持:
[给出]我在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 ---- /
我希望我能解释我的问题。感谢您可以与我分享的任何建议和支持。
非常感谢。
这可以通过许多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;