Oracle SQL 转置数据
Posted
技术标签:
【中文标题】Oracle SQL 转置数据【英文标题】:Oracle SQL Transpose data 【发布时间】:2018-01-23 05:14:27 【问题描述】:我有一个要求,我的数据来自这样的表
country total_population number_of_cities number_of_airports
US 1,000,000,000 500 25
UK 2,000,000,000 400 20
这是动态数据。我需要显示的结果
US UK
total_population 1,000,000,000 2,000,000,000
number_of_cities 500 400
number_of_airports 25 20
我怎样才能做到这一点? 非常感谢任何帮助或指示。
【问题讨论】:
[oracle]+[pivot]
有很多问题的答案。你知道关键词,为什么不看看these search results的一些???
这不是完全重复的。我的要求与普通的枢轴不同。问题是基本上用列交换行。多次尝试后找到了我的答案。解决方案是先取消旋转,然后再将其旋转回来。
好的。我已经重新打开了这个问题,所以你可以发布你的解决方案作为答案,如果你想这样做的话。
【参考方案1】:
您可以使用MAX
、CASE
和UNION ALL
的组合。
SELECT 'total_population' metric,
MAX(CASE
WHEN country = 'US' THEN total_population
END) US,
MAX(CASE
WHEN country = 'UK' THEN total_population
END) UK
FROM yourtable
UNION ALL
SELECT 'number_of_cities' metric,
MAX(CASE
WHEN country = 'US' THEN number_of_cities
END) US,
MAX(CASE
WHEN country = 'UK' THEN number_of_cities
END) UK
FROM yourtable
UNION ALL
SELECT 'number_of_airports' metric,
MAX(CASE
WHEN country = 'US' THEN number_of_airports
END) US,
MAX(CASE
WHEN country = 'UK' THEN number_of_airports
END) UK
FROM yourtable;
DEMO
【讨论】:
什么时候有三个国家在玩?这是很多打字。 PIVOT 运算符更易于维护并且(可以说)更易于理解。【参考方案2】:这是需求的解决方案。它基本上需要交换行和列。这可以通过首先取消旋转然后将其旋转回来来实现。这是查询
select *
from (
select
country,
total_population, number_of_cities, number_of_airports
FROM yourtable
) unpivot ( val for stats in (total_population, number_of_cities, number_of_airports))
pivot (sum(val) for country in ('US', 'UK'));
【讨论】:
以上是关于Oracle SQL 转置数据的主要内容,如果未能解决你的问题,请参考以下文章