我需要转置一个表,其中column1是实体的名称,column2到column366是持有美元金额的一年中的日期。该表,选择语句和输出结果均已给出 下方-
问题-这种语法要求我创建一个用逗号分隔的列列表-基本上是365个日期-并在select语句的IN子句中使用该列表。
喜欢-
..... unpivot(用于(“ 1-1-2020”,“ 1-2-2020”,“ 1-3-2020” ...... “ 12-31-2020” ))按2
排序还有更好的方法吗?喜欢使用正则表达式吗?我不想以 mm-dd-yyyy 格式输入365个日期,以免遇到麻烦
这是表格-第一行是列标题,第二行是分隔符。第三,第四和第五行是样本数据。
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中选择* 取消枢纽(((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
答案 0 :(得分:1)
没有PIVOT,有一种更简单的方法来执行此操作。 Snowflake为您提供了将整个行表示为“对象”的功能-键值对的集合。使用该表示形式,您可以对每个元素进行FLATTEN处理,并提取列名(键==日期)和其中的值(值== cash)。这是一个可以做到的查询:
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'
;