将单行转换为多列 Vertica
Convert single row to multiple columns 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
我的列将是固定的,每次结果都是一行,我如何修改查询以获得以下结果?
一种应该符合 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;
如果您还需要在预期输出中进行精确排序,那么我们可以向联合查询添加一个计算排序列,然后进行子查询并按此排序。
查看this示例,它完全满足您的需求。
更新评论:
but what if i have multiple columns and rows how can i transpose
我的 UDF 将为每一行执行 transpose/unpivot,例如:
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)
这也应该有效
SELECT StringTokenizerDelim((ID || ',' || NAME || ',' || VALUE1 || ',' || VALUE2), ',') over (partition by null) FROM my_table where ID = 1
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
我的列将是固定的,每次结果都是一行,我如何修改查询以获得以下结果?
一种应该符合 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;
如果您还需要在预期输出中进行精确排序,那么我们可以向联合查询添加一个计算排序列,然后进行子查询并按此排序。
查看this示例,它完全满足您的需求。
更新评论:
but what if i have multiple columns and rows how can i transpose
我的 UDF 将为每一行执行 transpose/unpivot,例如:
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)
这也应该有效
SELECT StringTokenizerDelim((ID || ',' || NAME || ',' || VALUE1 || ',' || VALUE2), ',') over (partition by null) FROM my_table where ID = 1