繁体   English   中英

如何在 PostgreSQL 中使用联合从宽表创建长表?

[英]How do I create long table from a wide table using union in PostgreSQL?

我有一个宽 PostgreSQL 表,我需要使用联合查询将其更改为长表。 表格是这样的:

访问日期 outfalls_free outfall_obstruction_comment outfall_obstruction_remedy 泻湖班轮 lagoon_liner_comment lagoon_liner_remedy
9/1/2022 经过 不是 需要 经过
9/30/2022 经过 没有必要 北美 修复后的护堤似乎无法支撑 修补
10/5/2022 经过 没有必要 失败 两个损坏区域 修补
10/14/2022 经过 没有必要 故障网元 泻湖撕裂 修补
2022 年 10 月 25 日 经过 没有必要 北美 没有观察到新的中断 没有必要
11/11/2022 经过 没有必要 经过 没有必要
10/19/2022 经过 没有必要 经过 没有必要
11/14/2022 经过 没有必要 经过 没有必要
11/20/2022 经过 没有必要 经过 没有必要
11/28/2022 经过 没有必要 经过 没有必要
12/15/2022 经过 没有必要 经过 没有必要

我想创建一个联合查询以从上面的表格创建下面的表格。

类别 日期 类型 状态 评论 补救
排放口 9/1/2022 梗阻 经过 没有必要
泻湖 9/1/2022 衬垫 经过 没有必要
排放口 9/30/2022 梗阻 经过 没有必要
泻湖 9/30/2022 衬垫 北美 修复后的护堤似乎无法支撑 修补
排放口 10/5/2022 梗阻 经过 没有必要
泻湖 10/5/2022 衬垫 失败 两个损坏区域 修补
排放口 10/14/2022 梗阻 经过 没有必要
泻湖 10/14/2022 衬垫 失败 NE泻湖撕裂 修补
排放口 2022 年 10 月 25 日 梗阻 经过 没有必要
泻湖 2022 年 10 月 25 日 衬垫 北美 没有观察到新的中断 没有必要
排放口 11/11/2022 梗阻 经过 没有必要
泻湖 11/11/2022 衬垫 经过 没有必要
排放口 10/19/2022 梗阻 经过 没有必要
泻湖 10/19/2022 衬垫 经过 没有必要
排放口 11/14/2022 衬垫 经过 没有必要
泻湖 11/14/2022 衬垫 经过 没有必要
排放口 11/20/2022 衬垫 经过 没有必要
泻湖 11/20/2022 衬垫 经过 没有必要
排放口 11/28/2022 衬垫 经过 没有必要
泻湖 11/28/2022 衬垫 经过 没有必要
排放口 12/15/2022 衬垫 经过 没有必要
泻湖 12/15/2022 衬垫 经过 没有必要

到目前为止,我可以通过以下方式将两列合二为一(例如 Status):

select "outfalls_free" as Status from public."Weekly Inspections"
union all
select "lagoon_liner" as Status from public."Weekly Inspections";

我如何实现第二个表? 我认为必须有一种比像上面那样组合多个查询更好的方法。 我是新的 SQL 和 PostgreSQL。 非常感谢任何帮助。

将列转换为行的一种简单方法是创建一个包含需要转换的列的数组,然后取消嵌套以创建行,例如

CREATE TABLE t (id int, a text, b text, c text);
INSERT INTO t VALUES (1,'a1','b1','c1'), (2,'a2','b2','c2');

SELECT id, unnest(array[a,b,c]) FROM t;

 id | unnest 
----+--------
  1 | a1
  1 | b1
  1 | c1
  2 | a2
  2 | b2
  2 | c2
(6 rows)

演示: db<>fiddle

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM