【问题标题】:Oracle SQL Transpose dataOracle SQL 转置数据
【发布时间】: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的一些???
  • 这不是完全重复的。我的要求与普通的枢轴不同。问题是基本上用列交换行。多次尝试后找到了我的答案。解决方案是先取消旋转,然后再将其旋转回来。
  • 好的。我已经重新打开了这个问题,所以你可以发布你的解决方案作为答案,如果你想这样做的话。

标签: sql oracle pivot transpose unpivot


【解决方案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'));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多