PostgreSQL使用列索引操作值

时间:2018-08-29 08:46:59

标签: sql postgresql

我有一个很奇怪的问题,我找不到实现的解决方案。

我有一张要重新格式化的表格,如下所示:

+-------+-------+-------+-------+-------+-------+---------+
| Col_1 | Col_2 | Col_3 | Col_4 | Col_5 | Col_6 | Formula |
+-------+-------+-------+-------+-------+-------+---------+
| x     | x     | x     | x     | x     | x     |         |
|       | y     |       | y     | y     | y     |       4 |
|       | z     | z     | z     | z     |       |       2 |
| t     | t     | t     | t     | t     | t     |       5 |
| m     | m     | m     |       |       |       |       5 |
+-------+-------+-------+-------+-------+-------+---------+

x,y,z和t是数字值,并且在每一行中,该值可以完全相同或为空白。在另一列中,为我提供了要操作的列索引。

然后,在视图中,我需要将此表转换为如下所示的内容:

+-------+-------+-------+-------+-------+-------+---------+
| Col_1 | Col_2 | Col_3 | Col_4 | Col_5 | Col_6 | Formula |
+-------+-------+-------+-------+-------+-------+---------+
| x     | x     | x     | x     | x     | x     |         |
|       |       |       | 2*y   | y     | y     |       4 |
|       | z     | z     | z     | z     |       |       2 |
|       |       |       |       | 5*t   | t     |       5 |
|       |       |       |       | 3*m   |       |       5 |
+-------+-------+-------+-------+-------+-------+---------+

用言语来说,我需要删除(或替换为0,因为不应将值包括在列总和中)列的值,直到公式列指定的索引为止,然后将此删除后的值的总和添加到指定的索引。 例如,在最后一行中,第1-5列被删除并添加到第5列。

列实际上被命名为col_1等,因此甚至可以进行字符串操作,但我不确定这是否是解决此问题的好方法。

我根本不知道如何处理此问题,因此不胜感激。 预先非常感谢您。

1 个答案:

答案 0 :(得分:0)

您可以编写CASE表达式,这些表达式返回NULL,先前字段和当前字段的总和乘以formula或原始列值(取决于{{1}) }。

formula

(注意:对于SELECT CASE WHEN formula < 1 THEN NULL WHEN formula = 1 THEN (coalesce(col_1, 0)) * formula ELSE col_1 END col_1, CASE WHEN formula < 2 THEN NULL WHEN formula = 2 THEN (coalesce(col_1, 0) + coalesce(col_2, 0)) * formula ELSE col_2 END col_2, ... CASE WHEN formula < 6 THEN NULL WHEN formula = 6 THEN (coalesce(col_1, 0) + coalesce(col_2, 0) + coalesce(col_3, 0) + coalesce(col_4, 0) + coalesce(col_5, 0) + coalesce(col_6, 0)) * formula ELSE col_6 END col_6, formula FROM elbat; ,这可以简化,但是就它的立场而言,它更加强调了模式。)