在 Snowflake 中获取列名称作为新列中的值

问题描述 投票:0回答:1

我有以下各列的样本数据;


total_container_cnt | forty_ft_container_cnt | twenty_ft_container_cnt | fifty_three_ft_container_cnt

3                   |      NULL              |    3                    |   NULL
2                   |       2                |      NULL               |   NULL



目标是得到以下输出;

预期产量

total_container_cnt | forty_ft_container_cnt | twenty_ft_container_cnt | fifty_three_ft_container_cnt | NEW_COLUMN

3                   |      NULL              |    3                    |   NULL      | 3*twenty_ft_container_cnt
2                   |       2                |      NULL               |   NULL      | 2* forty_ft_container_cnt


这是我的尝试,

select temp.*,
       case when forty_ft_container_cnt is not null then concat('total_container_cnt','*','forty_ft_container_cnt)
       when twenty_ft_container_cnt is not null then concat('total_container_cnt','*','twenty_ft_container_cnt')
       when fifty_three_ft_container_cnt is not null then concat('total_container_cnt','*','fifty_three_ft_container_cnt)
 end as new_column

from temp
      

这种方法有效,但涉及多个

case when
语句。是否可以在这里获得一些帮助以获得更简单/更短的解决方案?

snowflake-cloud-data-platform case
1个回答
0
投票

您需要UNPIVOT。在下面的示例中,为连接添加了 ID 列。

create or replace temporary table t0(
    id integer,
    total_container_cnt integer,
    forty_ft_container_cnt integer,
    twenty_ft_container_cnt integer,
    fifty_three_ft_container_cnt integer
) as
select * from values
    (101, 3, NULL, 3, NULL),
    (102, 2, 2, NULL, NULL);

with t1 as (
    select * from t0
    unpivot (
            count for container in (forty_ft_container_cnt, twenty_ft_container_cnt, fifty_three_ft_container_cnt)
        )
)
select
    t0.*,
    t1.count || '*' || container as new_column
from t0
join t1
on t0.id = t1.id
    and t1.count > 0;
身份证号码 TOTAL_CONTAINER_CNT FORTY_FT_CONTAINER_CNT TWENTY_FT_CONTAINER_CNT FIFTY_THREE_FT_CONTAINER_CNT NEW_COLUMN
101 3 3 3*TWENTY_FT_CONTAINER_CNT
102 2 2 2*FORTY_FT_CONTAINER_CNT
© www.soinside.com 2019 - 2024. All rights reserved.