首页 > 解决方案 > 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 替换,因为值不应该包含在列 sums 中)直到公式列指定的索引的列值,然后将此删除值的总和添加到指定的索引。例如,在最后一行中,第 1-5 列被删除并添加到第 5 列。

列的字面意思是 col_1 等,所以即使是字符串操作也是可能的,但我不确定这是否是解决这个问题的好方法。

我根本不知道如何处理这个问题,所以任何帮助表示赞赏。非常感谢您提前。

标签: sqlpostgresql

解决方案


您可以编写CASE表达式,返回NULL先前字段和当前字段的总和乘以formula或原始列值取决于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;

(注意:因为col_1这可以简化,但就目前而言,它更强调模式。)


推荐阅读