1

我在雪花上有一张桌子

类别 公制1 公制2 公制3
第一的 1 2 3
第二 4 5 6

我希望我的桌子是这样的:

指标 第一的 第二
公制1 1 4
公制2 2 5
公制3 3 6

我有一种方法可以使用UNPIVOTSnowflake-SQL 中的函数执行此操作:

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

但是,它以某种方式返回

类别 指标 数据
第一的 公制1 1
第一的 公制2 2
第一的 公制3 3
第二 公制1 4
第二 公制2 5
第二 公制3 6

这不是我想要的。

谁能在创建新表的情况下在一个 SQL 查询中帮助我解决这个问题?

我认为有一种方法可以解决此问题UNPIVOT,但我无法弄清楚。谢谢!

4

2 回答 2

2

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

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;
于 2021-08-25T00:06:27.107 回答
1

你在你原来的 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') )    
于 2021-08-25T00:50:14.353 回答