将表(列)值转换为独立的行

时间:2019-06-15 07:43:30

标签: sql postgresql

我有一个主键为(state+city)和其他columns (product1, product2, product3, product4)的表。我正在尝试创建一个新表,其中每一行将对应于(state+city)和产品(其中之一)和一些static_value列。如何在PostgreSQL查询中执行此操作?

最好查看我正在查看的输入和输出数据的示例。在该论坛上,我检查了各种在MySQL或SQL Server中将行转换为列的示例,但它们似乎无济于事。

示例数据表(“输入表”和“所需输出”标签)

https://docs.google.com/spreadsheets/d/1qQZhWXB_h80HfaDi6VOqeOs7CVNyW9gwtEd-GRqLHKc/edit#gid=1581374593

2 个答案:

答案 0 :(得分:3)

您可以使用并集全部一次选择一个列,如下所示。您可以根据需要向每个SELECT查询添加其他列(TextA,TextB,Date ...)。

SELECT State,City,'Product1' Product, Product1 Value FROM your_table
UNION ALL
SELECT State,City,'Product2' Product, Product2 Value FROM your_table
UNION ALL
SELECT State,City,'Product3' Product, Product3 Value FROM your_table
UNION ALL
SELECT State,City,'Product4' Product, Product4 Value FROM your_table

答案 1 :(得分:2)

您可以交叉连接,将各个列转换为行:

select t.state, t.city, x.product
form the_table t
  cross join lateral ( 
     values (t.product1), (t.product2), (t.product3)
  ) as x(product)

或更紧凑:

select t.state, t.city, x.product
form the_table t
  cross join unnest(array[t.product1, t.product2, t.product3]) as x(product)