如何将水平 table 转换为垂直 table - SQL?

How to convert a horizontal table into vertical table - SQL?

我在 Snowflake

上有一个 table
category Metric1 Metric2 Metric3
First 1 2 3
Second 4 5 6

我希望我的 table 像:

Metrics First Second
Metric1 1 4
Metric2 2 5
Metric3 3 6

我有一种方法可以使用 Snowflake 中的 UNPIVOT 函数-SQL:

SELECT * FROM my_table
    UNPIVOT
    (DATA for Metrics in 
    (
    Metric1, 
    Metric2, 
    Metric3
    )
    )

然而,它不知何故returns到

CATEGORY METRICS DATA
FIRST Metric1 1
FIRST Metric2 2
FIRST Metric3 3
SECOND Metric1 4
SECOND Metric2 5
SECOND Metric3 6

这不是我想要的。

任何人都可以在一个 SQL 查询 没有 创建新的 table 的情况下帮助我解决这个问题吗?

我认为 UNPIVOT 可以解决这个问题,但我想不通。谢谢!

一种方法是横向连接和聚合:

select v.metric,
       max(case when t.category = 'First' then v.value end) as first,
       max(case when t.category = 'Second' then v.value end) as second
from t cross join lateral
     (values ('Metric1', metric1),
             ('Metric2', metric2),
             ('Metric3', metric3)
     ) v(metric, value)
group by v.metric;

您在原来的 SQL 中很受欢迎...只需要 PIVOT 返回类别:

SELECT * FROM 
(
   SELECT * FROM CTE UNPIVOT 
          ( DATA FOR METRICS IN (METRIC_1, METRIC_2, METRIC_3))
) 
PIVOT (SUM (DATA) FOR CATEGORY IN ('FIRST','SECOND') ) 

复制|粘贴|运行

WITH CTE AS 
(SELECT 'FIRST' CATEGORY, 1 METRIC_1 ,2 METRIC_2,3 METRIC_3
UNION
SELECT 'SECOND' CATEGORY, 4 METRIC_1 ,5 METRIC_2,6 METRIC_3)
SELECT * FROM 
(
   SELECT * FROM CTE UNPIVOT ( DATA FOR METRICS IN (METRIC_1, METRIC_2, METRIC_3))
) 
    PIVOT (SUM (DATA) FOR CATEGORY IN ('FIRST','SECOND') )