我需要转置一个表,其中column1 是实体的名称,column2 到column366 是一年中包含美元金额的日期。表、select语句、输出结果都给定了
以下 -
问题 - 此语法要求我创建一个逗号分隔的列列表 - 基本上是 365 个日期 - 并在 select 语句的 IN 子句中使用该列表。
像这样 -
.....unpivot(现金日期在(“2020年1月1日”、“2020年1月2日”、“2020年1月3日”......“2020年12月31日”)) 按 2 排序
有更好的方法吗?就像正则表达式一样?我不想输入 365 个日期年-月-日格式化并获取腕管以解决我的麻烦
这是表格 - 第一行是列标题,第二行是分隔符。第 3、4、5 行是样本数据。
Name 01-01-2020 01-02-2020 01-03-2020 12-31-2020
---------------------------------------------------------------------------------------------------
Entity1 10.00 15.75 20.00 100.00
Entity2 11.00 16.75 20.00 10.00
Entity3 112.00 166.75 29.00 108.00
我可以使用下面的 select 语句转置它
从表1中选择*
unpivot(现金(“1-1-2020”、“1-2-2020”、“1-3-2020”)中的日期)按 2 排序
得到如下输出 -
Name-------------------dates-----------------------cash
--------------------------------------------------------------
Entity1 01-01-2020 10.00
Entity2 01-01-2020 11.00
Entity3 01-01-2020 112.00
...............................
.............................
.........
and so on
有一种更简单的方法可以在不使用 PIVOT 的情况下执行此操作。 Snowflake 为您提供了一个函数,可以将整行表示为“对象”——键值对的集合。通过该表示,您可以展平每个元素并提取列名称(键 == 日期)和其中的值(值 == 现金)。这是一个可以做到这一点的查询:
with obj as (
select OBJECT_CONSTRUCT(*) o from Table1
)
select o:NAME::varchar as name,
f.key::date as date,
f.value::float as cash
from obj,
lateral flatten (input => obj.o, mode => 'OBJECT') f
where f.key != 'NAME'
;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)