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】:

您可以使用MAXCASEUNION 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 转置数据的主要内容,如果未能解决你的问题,请参考以下文章

转置列 Oracle sql

oracle pl sql中如何将列数据转置为行

Oracle SQL:将多列转置为行

Oracle SQL Developer:如何使用 PIVOT 函数将行转置为列

在 Oracle SQL 中使用列名进行转置

关于sql 表 转置 相关的请教!