Is there a Snowflake command that will transform a table like this:
a,b,c
1,10,0.1
2,11,0.12
3,12,0.13
to a table like this:
key,value
a,1
a,2
a,3
b,10
b,11
b,13
c,0.1
c,0.12
c,0.13
?
This operation is often called melt
in other tabular systems, but the basic idea is to convert the table into a list of key value pairs.
There is an UNPIVOT
in SnowSQL, but as I understand it UNPIVOT
requires to manually specify every single column. This doesn't seem practical for a large number of columns.
Snowflake's SQL is powerful enough to perform such operation without help of third-party tools or other extensions.
Data prep:
CREATE OR REPLACE TABLE t(a INT, b INT, c DECIMAL(10,2))
AS
SELECT 1,10,0.1
UNION SELECT 2,11,0.12
UNION SELECT 3,12,0.13;
Query(aka "dynamic" UNPIVOT):
SELECT f.KEY, f.VALUE
FROM (SELECT OBJECT_CONSTRUCT_KEEP_NULL(*) AS j FROM t) AS s
,TABLE(FLATTEN(input => s.j)) f
ORDER BY f.KEY;
Output:
How does it work?
{ "A": 1,"B": 10,"C": 0.1 }
)