gpt4 book ai didi

sql - 如何选择多个现有的列名并将其分组为 1 列?

转载 作者:行者123 更新时间:2023-11-29 14:13:13 26 4
gpt4 key购买 nike

我正在使用 posgresql。如何将列名分组到一个列中,并将其值分组到现有表中的另一列中?然后用它来创建一个临时表?

现有表:

+---------+----------+---------+----------+
| col_a | col_b | col_c | col_d |
+---------+----------+---------+----------+
| 1 | 2 | 3 | 4 |
+---------+----------+---------+----------+

临时表:

+----------+----------+
|categories| value |
+----------+----------+
| col_a | 1 |
| col_b | 2 |
| col_c | 3 |
| col_d | 4 |
+----------+----------+

下面是生成临时表的sql语句。

CREATE TEMPORARY table myTable_temp
(
categories Varchar (50),
value float8
);

但我仍然坚持尝试将特定列名称分组到一列中,并将其值放在另一列中,但仍将它们链接在一起。

最佳答案

此过程也称为 UNPIVOT,可以在 Postgres 中像这样完成:

select up.*
from the_table
cross join lateral (
values
('col_a', col_a),
('col_b', col_b),
('col_c', col_c),
('col_d', col_d)
) as up(category, value);

请注意,这仅适用于所有列都具有相同数据类型的情况。

如果您不介意丢失数据类型(或者如果列有不同的类型并且您无论如何都需要将它们转换为 text),您可以使用 JSON 函数使其动态化:

select up.*
from the_table tt
cross join lateral jsonb_each_text(to_jsonb(tt)) as up;

如果您知道所有值都可以转换为同一类型,您可以使用:

select up.category, 
up.value::float
from the_table tt
cross join lateral jsonb_each_text(to_jsonb(tt)) as up(category, value);

在线示例:https://rextester.com/SHOY36906


如果您需要将“值”列与表的原始主键匹配,您可以这样做(假设主键名为id)

select tt.id, up.*
from the_table tt
cross join lateral jsonb_each_text(to_jsonb(tt) - 'id') as up(category, value)
order by tt.id;

在线示例:https://rextester.com/MSXD50860

关于sql - 如何选择多个现有的列名并将其分组为 1 列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58429322/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com