我有以下各列的样本数据;
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
语句。是否可以在这里获得一些帮助以获得更简单/更短的解决方案?
您需要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 |