将单行转换为多列Vertica

时间:2018-01-30 05:39:12

标签: sql vertica

SELECT ID,NAME,VALUE1,VALUE2 FROM my_table where ID=1 ;

查询会给我输出

ID|NAME|VALUE1|VALUE2
1|XYZ|123|325

但我希望以下格式输出

ID    |1
NAME  |XYZ
VALUE1|123
VALUE2|325

我的列将被修复,每次结果都是一行时,如何修改查询以获得以下结果?

3 个答案:

答案 0 :(得分:1)

应该符合ANSI标准的一种方法是使用一系列联合:

SELECT 'ID' AS key, ID AS value FROM my_table WHERE ID=1
UNION ALL
SELECT 'NAME', NAME FROM my_table WHERE ID=1
UNION ALL
SELECT 'VALUE1', VALUE1 FROM my_table WHERE ID=1
UNION ALL
SELECT 'VALUE2', VALUE2 FROM my_table WHERE ID=1;

如果您还需要预期输出中的确切排序,那么我们可以将一个计算的排序列添加到联合查询,然后是子查询并按顺序排序。

答案 1 :(得分:1)

检查this示例,它完全符合您的需要。

评论更新:

  

但如果我有多个列和行怎么能转置

我的UDF将为每一行进行转置/取消转储,例如:

daniel=> select * from test limit 4;
 user_id | day_of_week | to_sample
---------+-------------+-----------
       1 |           1 |         1
       1 |           2 |         2
       2 |           1 |         1
       2 |           2 |         2
(4 rows)

daniel=> select unpivot(*) over () from test limit 8;
     KEY     | VALUE
-------------+-------
 user_id     | 1
 day_of_week | 1
 to_sample   | 1
 user_id     | 1
 day_of_week | 2
 to_sample   | 2
 user_id     | 2
 day_of_week | 1
(8 rows)

答案 2 :(得分:0)

这也应该有效

SELECT StringTokenizerDelim((ID || ',' || NAME || ',' || VALUE1 || ',' || VALUE2), ',') over (partition by null) FROM my_table where ID = 1