您可以逆转置使用json functionsrow_to_json()
和json_each_text()
表。另外,使用with ordinality
来获得列号。例如:
create table a_table (fcst_month int, val1 int, val2 int, val3 int);
insert into a_table values
(1, 10, 20, 30),
(2, 40, 50, 60);
select fcst_month, ordinality, key, value
from a_table, json_each_text(row_to_json(a_table)) with ordinality;
fcst_month | ordinality | key | value
------------+------------+------------+-------
1 | 1 | fcst_month | 1
1 | 2 | val1 | 10
1 | 3 | val2 | 20
1 | 4 | val3 | 30
2 | 1 | fcst_month | 2
2 | 2 | val1 | 40
2 | 3 | val2 | 50
2 | 4 | val3 | 60
(8 rows)
现在可以很容易地聚合值由它的位置选择列:
select fcst_month, sum(value::int)
from a_table, json_each_text(row_to_json(a_table)) with ordinality
where ordinality > 1
group by 1
order by 1;
fcst_month | sum
------------+-----
1 | 60
2 | 150
(2 rows)
个人而言,我会使用val1+ val2+ val3...
即使是39列,除非我不得不处理一些动态,如未知数量的列。
你真的有很多专栏吗?那里有多少? –
有39个值列,但列名不是静态的 –
如果我正确地理解了它,为什么你不能只用“fcst_month”从表组中选择fcst_month,sum(val1 + val2 + ... + valN)?如果您向我们提供一些数据示例(输入和输出),会很好。 – Christian