简体   繁体   English

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

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

Unable to pivot multiple columns in snowflake and I would appreciate it if some one can help me:无法 pivot 雪花中的多列,如果有人能帮助我,我将不胜感激:

I basically have the table attached in the screenshot in the left and need to change it to the format in the right.我基本上在左侧的屏幕截图中附加了表格,需要将其更改为右侧的格式。 I wonder if pivot can work in this case?我想知道 pivot 在这种情况下是否可以工作?

my current code:我当前的代码:

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

link to screenshot截图链接

So assuming the SQL you have posted is more like this (with included fake data in a CTE)因此,假设您发布的 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

I swapped you CASE for an IFF and puting the which column does it belong in. And I swapped IFNULL(x, 0) for ZEROIFNULL(x) while longer, it more intent clear.我将您的CASE换成IFF ,并将它属于哪一列。我将IFNULL(x, 0) ZEROIFNULL(x) ,时间更长,意图更清晰。

which gives results that look like your existing output:它给出的结果看起来像您现有的 output:

CLOSED_DATE CLOSED_DATE REVENUE_AMER REVENUE_AMER REVENUE_APAC收入_亚太地区 REVENUE_EMEA收入_欧洲、中东和非洲
20-Q1 20-Q1 1 1个 0 0 0 0
20-Q2 20-Q2 0 0 2 2个 0 0
20-Q3 20-Q3 0 0 0 0 3 3个
21-Q1 21-Q1 0 0 0 0 4 4个

so if that hold as "the way it is", then to get to "where you want to go" you need to find the distinct set of values or locations, and then join to your results based on that.因此,如果它保持“原样”,那么要到达“你想去的地方”,你需要找到一组不同的值或位置,然后根据它加入你的结果。

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;

gives:给出:

LOC本地代码 20-Q1 20-Q1 20-Q2 20-Q2 20-Q3 20-Q3 21-Q1 21-Q1
amer阿米尔 1 1个 0 0 0 0 0 0
apac亚太地区 0 0 2 2个 0 0 0 0
emea欧洲、中东和非洲 0 0 0 0 3 3个 4 4个

Now the downside of this pattern is you need to explicitly know the column names, but you have that problem in the PIVOT case as well.现在这种模式的缺点是您需要明确知道列名,但在 PIVOT 的情况下也有这个问题。 That could be worked around with Snowflake Scripting I believe.我相信这可以通过 Snowflake Scripting 来解决。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM