如何将水平 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') )
我在 Snowflake
上有一个 tablecategory | 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') )