Tho*_*ier 10 unpivot tableau-api amazon-redshift
在红移:
我有一个包含 30 个维度字段和 150 多个度量字段的表。
为了在可视化工具 (Tableau) 中充分利用这些数据,我需要将度量列逆透视为仅一个度量和一个维度以对它们进行分类。
简短示例:
Date Country Order Banana Apple Orange Kiwi Lemon
1-10-2018 Belgium XYZ789 14 0 10 16 7
1-10-2018 Germany ABC123 10 15 3 15 3
2-10-2018 Belgium KLM456 9 9 7 1 7
Run Code Online (Sandbox Code Playgroud)
结果 :
Date Country Order Measure_Name Measure_Value
1-10-2018 Belgium XYZ789 Banana 14
1-10-2018 Belgium XYZ789 Apple 0
1-10-2018 Belgium XYZ789 Orange 10
1-10-2018 Belgium XYZ789 Kiwi 16
1-10-2018 Belgium XYZ789 Lemon 7
1-10-2018 Germany ABC123 Banana 10
1-10-2018 Germany ABC123 Apple 15
1-10-2018 Germany ABC123 Orange 3
1-10-2018 Germany ABC123 Kiwi 15
1-10-2018 Germany ABC123 Lemon 3
2-10-2018 Belgium KLM456 Banana 9
2-10-2018 Belgium KLM456 Apple 9
2-10-2018 Belgium KLM456 Orange 7
2-10-2018 Belgium KLM456 Kiwi 1
2-10-2018 Belgium KLM456 Lemon 7
Run Code Online (Sandbox Code Playgroud)
我知道并且我已经尝试过“UNION ALL”解决方案,但是我的表有数百万行,并且有超过 150 列要取消旋转,对于这个解决方案来说实在是太大了。(即使 SQL 超过 8k 行)
你有什么想法可以帮助我吗?
非常感谢,
当以“命令式”方式编写此代码时,您希望从一行中生成更多行,可能使用flatMap(或您的编程语言中的等效项)之类的东西。要在 SQL 中生成行,您必须使用JOIN.
这个问题可以通过 ( CROSS)JOIN将你的表与另一个表结合来解决,行数与要逆透视的列数一样多。您需要添加一些条件魔法,瞧!.
CREATE TABLE t (
"Date" date,
"Country" varchar,
"Order" varchar,
"Banana" varchar,
"Apple" varchar,
"Orange" varchar,
"Kiwi" varchar,
"Lemon" varchar
);
INSERT INTO t VALUES ('1-10-2018', 'Belgium', 'XYZ789', '14', '0', '10', '16', '7');
INSERT INTO t VALUES ('1-10-2018', 'Germany', 'ABC123', '10', '15', '3', '15', '3');
INSERT INTO t VALUES ('2-10-2018', 'Belgium', 'KLM456', '9', '9', '7', '1', '7');
WITH
cols as (
select 'Banana' as c
union all
select 'Apple' as c
union all
select 'Orange' as c
union all
select 'Kiwi' as c
union all
select 'Lemon' as c
)
select
"Date",
"Country",
"Order",
c "Fruit Type",
CASE c
WHEN 'Banana' THEN "Banana"
WHEN 'Apple' THEN "Apple"
WHEN 'Orange' THEN "Orange"
WHEN 'Kiwi' THEN "Kiwi"
WHEN 'Lemon' THEN "Lemon"
ELSE NULL
END as "Amount Ordered"
from t cross join cols;
Run Code Online (Sandbox Code Playgroud)
https://www.db-fiddle.com/f/kojuPAjpS5twCKXSPVqYyP/3
鉴于您有 150 列需要转置,我认为使用 SQL 来完成此操作是不可行的。我遇到过几乎相同的场景并使用 python 来解决它。伪代码和解释在这个问题中