将单行转换为多列 Vertica

4
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

我的列将是固定的,每次结果都将是单行,我该如何修改查询以获得下面的结果?

请检查我的 unpivot 实现。根据您的需求进行修改。 - sKwa
1
我不相信有任何类似这样的v-sql功能可以直接使用,而不需要为每个操作编写一个联合查询。就像@sKwa建议的那样,您可以加载自定义UDF并以此方式进行解构。相关讨论在这里:https://forum.vertica.com/discussion/219577/vertica-sql-data-transformation - colinwurtz
2
@colinwurtz,我已经在这里完成了[https://forum.vertica.com/discussion/239423/unpivot-functionality]。但是谁在乎呢? - sKwa
@sKwa 真是太棒了,我可能会尝试使用这个。 - colinwurtz
@colinwurtz 没问题。我会在不久的将来改进它:支持所有数据类型+性能问题。 - sKwa
显示剩余3条评论
3个回答

3

请查看示例,它恰好可以满足您的需求。

评论更新:

但如果我有多列和多行,怎么办?如何进行转置?

我的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)

谢谢,但如果我有多列和多行,如何进行转置? - Swathi8038
@Swathi8038:你是什么意思?能给个例子吗?或者如果有功能缺失,你可以在GitHub上开一个工单吗?我的UDF将为每一行执行“unpivot”。 - sKwa
@Swathi8038:开一个新问题,因为你要问的功能是“PIVOT”,而不是“UNPIVOT”。 - sKwa

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
尝试了这种方法,但如果我有更多的列,它可能会变得很繁琐。 - Swathi8038

0

这个也应该可以工作

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接