amazon-redshift - Redshift-多列至行(不可透视)

标签 amazon-redshift tableau-api unpivot

在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

结果:
   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

我知道并且我已经尝试过'UNION ALL'解决方案,但是我的表数百万行,而超过150列无法枢转对于该解决方案来说确实太大了。 (即使SQL的长度超过8k行)

您有什么想法可以帮助我吗?

非常感谢,

最佳答案

当以“命令式”方式编写此代码时,您可能想使用flatMap(或您的编程语言中的等效语言)从一行中生成更多行。要在SQL中生成行,您必须使用JOIN

这个问题可以通过(CROSS)JOIN与另一个表进行解决,该表的行数与要取消透视的列数相同。您需要添加一些条件魔术和Voila!。

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;

https://www.db-fiddle.com/f/kojuPAjpS5twCKXSPVqYyP/3

关于amazon-redshift - Redshift-多列至行(不可透视),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52781423/

相关文章:

javascript - 从服务器获取所有画面工作簿

sql - 使用列名称对 UnPivoted 数据进行 SP 或函数

MySQL 数据透视表 - 如何将动态列转换为行?

amazon-web-services - 将数据从单个 Kinesis Stream 流式传输到 Redshift 中的多个表

postgresql - 如何在 redshift 中创建 READ ONLY 用户

reporting-services - Tableau 能否用于面向客户的 Web 应用程序和 SaaS Web 应用程序?

sql - 使用多列交叉应用动态 SQL 逆透视数据

sql - 您如何为 Amazon redshift 数据库编写查询,以便相关查询的 where 子句具有两个条件?

amazon-web-services - AWS Kinesis 连接器库

scala - 共享 HDInsight SPARK SQL 表 saveAsTable 不起作用