【问题标题】:UNPIVOT in Snowflake and adding additional columns雪花中的 UNPIVOT 并添加其他列
【发布时间】:2021-12-28 19:51:30
【问题描述】:

我正在尝试取消透视表 TABLE_A 并向查询中添加其他列

TABLE_A:

YEAR ID OCT NOV DEC JAN FEB MAR APR MAY JUN JUL AUG SEP
2022 1 10 5 5 10 5 10 15 20 5 0 0 10

预期输出:

ID MONTHLY_NO MONTH START_DATE YEAR
1 10 10 10-01-2021 2021
1 5 11 11-01-2021 2021
1 5 12 12-01-2021 2021
1 10 1 01-01-2022 2022
1 5 2 02-01-2022 2022
1 10 3 03-01-2022 2022
1 15 4 04-01-2022 2022
1 20 5 05-01-2022 2022
1 5 6 06-01-2022 2022
1 0 7 07-01-2022 2022
1 0 8 08-01-2022 2022
1 10 9 09-01-2022 2022

我使用的查询:

SELECT ID, 
MONTHLY_NO, 
CASE 
WHEN TGT_MONTH='JAN' THEN 1
WHEN TGT_MONTH='FEB' THEN 2
WHEN TGT_MONTH='MAR' THEN 3
WHEN TGT_MONTH='APR' THEN 4
WHEN TGT_MONTH='MAY' THEN 5
WHEN TGT_MONTH='JUN' THEN 6
WHEN TGT_MONTH='JUL' THEN 7
WHEN TGT_MONTH='AUG' THEN 8
WHEN TGT_MONTH='SEP' THEN 9
WHEN TGT_MONTH='OCT' THEN 10
WHEN TGT_MONTH='NOV' THEN 11
WHEN TGT_MONTH='DEC' THEN 12
END AS MONTH
FROM TABLE_A
UNPIVOT( MONTHLY_NO FOR TGT_MONTH IN (JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC));

如何将 START_DATE 和 YEAR 列添加到查询中?可以请教吗?

【问题讨论】:

    标签: sql snowflake-cloud-data-platform


    【解决方案1】:

    按照UNPIVOT 文档中的模式,使用您的table_a

    SELECT *
    FROM table_a
    UNPIVOT( monthly_no FOR tgt_month IN (jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec))
    

    应该给出(忽略缺少排序,并假设 yearidmonthly_no 都是 NUMBER):

    YEAR    ID  TGT_MONTH   MONTHLY_NO
    2022    1   'JAN'       10
    2022    1   'FEB'       5
    2022    1   'MAR'       10
    2022    1   'APR'       15
    2022    1   'MAY'       20
    2022    1   'JUN'       5
    2022    1   'JUL'       0
    2022    1   'AUG'       0
    2022    1   'AUG'       10
    2022    1   'OCT'       10
    2022    1   'NOV'       5
    2022    1   'DEC'       5
    

    如果您不受列顺序的困扰,可以使用单个内联表单:

    SELECT year, 
        id, 
        monthly_no, 
        TO_DATE(year::text || tgt_month, 'YYYYMON') AS start_date, 
        MONTH(start_date) AS month
    FROM table_a
    UNPIVOT( monthly_no FOR tgt_month IN (jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec))
    

    否则要按照您希望的顺序获取它,您必须重复执行相同的逻辑,或者嵌套它。

    重复版本:

    SELECT 
        id, 
        monthly_no, 
        MONTH(TO_DATE(year::text || tgt_month, 'YYYYMON')) AS month,
        TO_DATE(year::text || tgt_month, 'YYYYMON') AS start_date,
        year    
    FROM table_a
    UNPIVOT( monthly_no FOR tgt_month IN (jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec))
    

    嵌套:

    SELECT 
        id, 
        monthly_no, 
        MONTH(start_date) AS month,
        start_date,
        year    
    FROM (
        SELECT 
            id, 
            monthly_no, 
            TO_DATE(year::text || tgt_month, 'YYYYMON') AS start_date,
            year    
        FROM table_a
        UNPIVOT( monthly_no FOR tgt_month IN (jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec))
    )
    

    哦,我只是故意摸摸你是 2021 年 10 月、11 月、12 月,即使你没有提到它。这可以通过一些内联 IFF 来解决

    SELECT 
        id, 
        monthly_no, 
        MONTH(start_date) AS month,
        IFF(month >= 10, DATEADD('year', -1, start_date), start_date) AS start_date
        IFF(month >= 10, year -1, year) AS year 
    FROM (
        SELECT 
            id, 
            monthly_no, 
            TO_DATE(year::text || tgt_month, 'YYYYMON') AS start_date,
            year    
        FROM table_a
        UNPIVOT( monthly_no FOR tgt_month IN (jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec))
    )
    

    【讨论】:

    • 谢谢你,西蒙!你的答案就是我想要的:)
    【解决方案2】:

    您应该能够只选择所需的其他列。我为此使用了一个 SQL 服务器示例,但原则上它应该以相同的方式工作。请参阅下面的查询:

    SELECT ID, 
    year,
    CASE
    WHEN TGT_MONTH='JAN' THEN '01/01/'+CAST(year as CHAR(4))
    WHEN TGT_MONTH='FEB' THEN '02/01/'+CAST(year as CHAR(4))
    WHEN TGT_MONTH='MAR' THEN '03/01/'+CAST(year as CHAR(4))
    WHEN TGT_MONTH='APR' THEN '04/01/'+CAST(year as CHAR(4))
    WHEN TGT_MONTH='MAY' THEN '05/01/'+CAST(year as CHAR(4))
    WHEN TGT_MONTH='JUN' THEN '06/01/'+CAST(year as CHAR(4))
    WHEN TGT_MONTH='JUL' THEN '07/01/'+CAST(year as CHAR(4))
    WHEN TGT_MONTH='AUG' THEN '08/01/'+CAST(year as CHAR(4))
    WHEN TGT_MONTH='SEP' THEN '09/01/'+CAST(year as CHAR(4))
    WHEN TGT_MONTH='OCT' THEN '10/01/'+CAST(year as CHAR(4))
    WHEN TGT_MONTH='NOV' THEN '11/01/'+CAST(year as CHAR(4))
    WHEN TGT_MONTH='DEC' THEN '12/01/'+CAST(year as CHAR(4))
    END as starting_date,
    CASE 
    WHEN TGT_MONTH='JAN' THEN 1
    WHEN TGT_MONTH='FEB' THEN 2
    WHEN TGT_MONTH='MAR' THEN 3
    WHEN TGT_MONTH='APR' THEN 4
    WHEN TGT_MONTH='MAY' THEN 5
    WHEN TGT_MONTH='JUN' THEN 6
    WHEN TGT_MONTH='JUL' THEN 7
    WHEN TGT_MONTH='AUG' THEN 8
    WHEN TGT_MONTH='SEP' THEN 9
    WHEN TGT_MONTH='OCT' THEN 10
    WHEN TGT_MONTH='NOV' THEN 11
    WHEN TGT_MONTH='DEC' THEN 12
    END AS MONTH
    FROM 
      (
         SELECT year, id, oct, nov, dec, jan, feb, mar, apr, may, jun, jul, aug, sep
         FROM monthly_sales
      ) as pvt
      UNPIVOT(MONTHLY_NO FOR TGT_MONTH IN (JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC))
      As unpvt;
    

    你可以在这里看到我的 sqlfiddle:http://sqlfiddle.com/#!18/48ee0/7/0

    【讨论】:

    • 谢谢!如果您注意到从 10 月到 12 月的年份和月份,那将是当前年份 -1。使用您的方法,我需要另一个案例陈述来处理我采取的 FY?
    猜你喜欢
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 2020-06-25
    • 1970-01-01
    • 2020-03-30
    • 1970-01-01
    • 1970-01-01
    • 2021-01-01
    相关资源
    最近更新 更多