【问题标题】:Convert row values into columns based on row values multi level hierarchy基于行值多级层次结构将行值转换为列
【发布时间】:2016-03-17 13:56:50
【问题描述】:

我有一个这样的 ORACLE 表

---------------------------------------
DATE        |  USERID | DOMAIN | VALUE
---------------------------------------
03/16/2016     1001     ASIA      10
03/16/2016     1001     EUROPE    20
03/16/2016     1002     ASIA      20
03/17/2016     1001     ASIA      20
03/17/2016     1002     EUROPE    10
----------------------------------------

我想把这张表翻译成这样的视图

 -------------------------------------
 DATE       |  USERID | ASIA | EUROPE  
 -------------------------------------
 03/16/2016     1001     10     20
 03/16/2016     1002     20      
 03/17/2016     1001     20
 03/17/2016     1002            10 
 -------------------------------------

如果我尝试使用 PIVOT,我可以在用户级别执行此操作,但不知道如何获取日期,用户级别。任何指针都会很棒。

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    PIVOT 似乎达到了你需要的结果:

    SQL> with test (DATE_, USERID, DOMAIN, VALUE)
      2  as (
      3   select '03/16/2016',     1001     ,'ASIA'      ,10 from dual union all
      4   select '03/16/2016',     1001     ,'EUROPE'    ,20 from dual union all
      5   select '03/16/2016',     1002     ,'ASIA'      ,20 from dual union all
      6   select '03/17/2016',     1001     ,'ASIA'      ,20 from dual union all
      7   select '03/17/2016',     1002     ,'EUROPE'    ,10 from dual
      8  )
      9  SELECT *
     10  FROM   (select *
     11          from test)
     12  PIVOT ( sum(value) FOR (domain) IN ('ASIA', 'EUROPE'))
     13  ORDER BY 1, 2;
    
    DATE_          USERID     'ASIA'   'EUROPE'
    ---------- ---------- ---------- ----------
    03/16/2016       1001         10         20
    03/16/2016       1002         20
    03/17/2016       1001         20
    03/17/2016       1002                    10
    

    【讨论】:

      【解决方案2】:

      做一个GROUP BY,使用case表达式来选择亚洲或欧洲:

      select DATE, USERID,
             sum(case when DOMAIN = 'ASIA' then VALUE end) as asia
             sum(case when DOMAIN = 'EUROPE' then VALUE end) as europe
      from tablename
      group by DATE, USERID 
      

      回答不支持现代 Oracle 版本的产品PIVOT

      【讨论】:

      【解决方案3】:

      您可以将 PIVOT 功能与

      一起使用
      pivot 
      (
         count(VALUE)
         for DOMAIN in ("ASIA", "EUROPE")
      )
      

      ,将查询包装在子选择中,然后按 UserID 对结果进行分组。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-27
        • 1970-01-01
        • 2022-09-27
        • 2015-05-03
        • 1970-01-01
        • 2014-07-23
        相关资源
        最近更新 更多