在postgres中将一列转换为多列

时间:2016-06-06 21:07:32

标签: postgresql pivot postgresql-9.2 greenplum

我有一张如下表:

enter image description here

想在postgres上更改以下格式:

enter image description here

我尝试使用case语句,但没有给出我想要的结果。 提前感谢您的帮助!

修改

select (case when column_1='A' then column_1 else 'other' end) column_1,
(case when column_1='B' then Column_1 else 'other' end) column_2 from test_t
 where id= random_value;

每次查询只返回2行,而column_1中的行值是动态的而不是固定的。

4 个答案:

答案 0 :(得分:0)

您并没有真正提供足够的信息来真正回答问题,但这就是您将这两行从一列转换为两列并强制进入一行的方式。

select max(column_1) as column_1, max(column_2) as column_2
from (select case when column_1 = 'A' then column_1 else '' end as column_1,
             case when column_1 = 'B' then column_1 else '' end as column_2
      from table_name);

答案 1 :(得分:0)

我们走了......

CREATE TABLE test_table(column_1 text);

INSERT INTO test_table ('A'),('B');

SELECT * FROM test_table ;

column_1
---------
B
A

SELECT
max(case when column_1='A' THEN column_1 END) column_1,
max(case when column_1='B' THEN column_1 END) column_2
from test_table;

column_1 | column_2
----------+----------
 A        | B

在PostgreSQL中,您可以使用crosstab()轻松完成此操作,但在greenplum中仍然无法实现

答案 2 :(得分:0)

如果要转置总是的结果只有2行,那么无论这些列的内容如何,​​这都会有效,如您所知:

SELECT
MAX(CASE WHEN row_number=1 THEN column_1 END) column_1,
MAX(CASE WHEN row_number=2 THEN column_1 END) column_2
FROM (SELECT column_1, 
             ROW_NUMBER() OVER (ORDER BY test_table.column_1) 
      FROM test_table) t;

 column_1 | column_2
----------+----------
 A        | B

答案 3 :(得分:0)

请参阅此链接。以前回答。

stackoverflow.com/a/10625294/1870151

SELECT
    unnest(array['col1', 'col2', 'col3']) AS "Columns",
     unnest(array[col1::text, col2::text, col3::text]) AS "Values"
FROM tbl;