簡體   English   中英

在 Snowflake 中翻轉表中的多列和多行

[英]Flip a Multiple Columns and multiple rows in table in Snowflake

無法 pivot 雪花中的多列,如果有人能幫助我,我將不勝感激:

我基本上在左側的屏幕截圖中附加了表格,需要將其更改為右側的格式。 我想知道 pivot 在這種情況下是否可以工作?

我當前的代碼:

select 
CONCAT(RIGHT(TO_VARCHAR(YEAR(DATE)),2),'-Q',TO_VARCHAR(QUARTER(DATE)) ) closed_date,
IFNULL(sum(case when STAG='Closed' then REVENUE_AMOUNTS end),0) REVENUE AMER,
IFNULL(sum(case when STAG='Closed' then REVENUE_AMOUNTS end),0) REVENUE APAC,
IFNULL(sum(case when STAG='Closed' then REVENUE_AMOUNTS end),0) REVENUE EMEA

from REVENUE_TABLE
where 1=1
group by 1
order by 1 asc

截圖鏈接

因此,假設您發布的 SQL 更像是這樣(在 CTE 中包含虛假數據)

WITH REVENUE_TABLE as (
    SELECT * FROM VALUES
    ('Closed', 1, '2020-01-01'::date, 'amer'),
    ('Closed', 2, '2020-04-01'::date, 'apac'),
    ('Closed', 3, '2020-08-01'::date, 'emea'),
    ('Closed', 4, '2021-01-01'::date, 'emea')
    v(stag, REVENUE_AMOUNTS, date, loc)
)
select 
    CONCAT(RIGHT(TO_VARCHAR(YEAR(DATE)),2),'-Q',TO_VARCHAR(QUARTER(DATE)) ) closed_date,
    ZEROIFNULL(sum(IFF(loc='amer' AND STAG='Closed', REVENUE_AMOUNTS, null))) as REVENUE_AMER,
    ZEROIFNULL(sum(IFF(loc='apac' AND STAG='Closed', REVENUE_AMOUNTS, null))) as REVENUE_APAC,
    ZEROIFNULL(sum(IFF(loc='emea' AND STAG='Closed', REVENUE_AMOUNTS, null))) as REVENUE_EMEA
from REVENUE_TABLE
group by 1
order by 1 asc

我將您的CASE換成IFF ,並將它屬於哪一列。我將IFNULL(x, 0) ZEROIFNULL(x) ,時間更長,意圖更清晰。

它給出的結果看起來像您現有的 output:

CLOSED_DATE REVENUE_AMER 收入_亞太地區 收入_歐洲、中東和非洲
20-Q1 1個 0 0
20-Q2 0 2個 0
20-Q3 0 0 3個
21-Q1 0 0 4個

因此,如果它保持“原樣”,那么要到達“你想去的地方”,你需要找到一組不同的值或位置,然后根據它加入你的結果。

select l.loc,
    ZEROIFNULL(sum(IFF(r.cd='20-Q1', r.REVENUE_AMOUNTS, null))) as "20-Q1",
    ZEROIFNULL(sum(IFF(r.cd='20-Q2', r.REVENUE_AMOUNTS, null))) as "20-Q2",
    ZEROIFNULL(sum(IFF(r.cd='20-Q3', r.REVENUE_AMOUNTS, null))) as "20-Q3",
    ZEROIFNULL(sum(IFF(r.cd='21-Q1', r.REVENUE_AMOUNTS, null))) as "21-Q1"
from (
    select distinct loc 
    FROM REVENUE_TABLE
) as l
left join (
    select loc, 
        revenue_amounts,
        CONCAT(RIGHT(TO_VARCHAR(YEAR(DATE)),2),'-Q',TO_VARCHAR(QUARTER(DATE)) ) cd 
    FROM REVENUE_TABLE
    WHERE STAG='Closed'
) as r on l.loc = r.loc
group by 1
order by 1 asc;

給出:

本地代碼 20-Q1 20-Q2 20-Q3 21-Q1
阿米爾 1個 0 0 0
亞太地區 0 2個 0 0
歐洲、中東和非洲 0 0 3個 4個

現在這種模式的缺點是您需要明確知道列名,但在 PIVOT 的情況下也有這個問題。 我相信這可以通過 Snowflake Scripting 來解決。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM