Oracle - 在数据透视表中查找数据

时间:2013-06-20 21:01:44

标签: oracle pivot

我有一张表格,其中的栏目如下:
USERID,USERTYPE,DIVISION,SUBDIVISION

对于每个用户标识,将有一个或多个用户类型(例如,用户可以是开发人员或管理员或两者)。根据用户类型,用户可以订阅分部和可选的子分区 USERID,USERTYPE和DIVISION不是空列。

输出需要采用以下格式 -

  1. USERID,USERTYPE,DIVISION1,DIVISION2,DIVISION3 ..等等
    因此,对于USERID-USERTYPE的组合应该有唯一的记录。 为此,我使用了PIVOT运算符,它工作正常。我还创建了一个临时表(比如说Table1)来存储这个查询的结果。
  2. 现在,如果用户订阅了细分,则细分值应该在该分区下写为逗号分隔值。如果它没有订阅细分,则简单的划分将出现在其各自的列下。
    我使用LISTAGG函数编写了一个查询,它为每个USERID-USERTYPE组合提供了逗号分隔的细分。此查询的结果存储在Table2中。
  3. 现在当我加入USERID和USERTYPE上的Table1和Table2表时,我得到一个USERID-USERTYPE组合的多行,这很明显但不是需要的。

    以下是一些示例数据:

    Sample Data


    请注意USERID = 3的记录 我得到的是“加入查询的结果”,我需要的是“最终结果”。

    此外,我不能在数据透视查询之前使用LISTAGG,因为稍后在构建数据透视查询时,列出所有可能的细分组合将会非常繁琐。

    我确信我在这里遗漏了一些小问题,但无法弄清楚是什么。
    任何建议或指示都会有很大的帮助 提前谢谢。

1 个答案:

答案 0 :(得分:1)

无需在透视查询中列出所有细分,只需在USERID, USERTYPE, DIVISION和使用nvl(AGGREGATED_VALUE,DIVISION)的一组独特组合中汇总,即可获得填充数据透视表的值。

如果source_table是您在问题中首先提到的USERID, USERTYPE, DIVISION, SUBDIVISION列的表格,那么此示例必须适合您:

select * from (
  select
    userid,
    usertype,
    division, 
    -- get prepared value for pivot
    nvl(
      listagg(subdivision, ',') within group (order by subdivision),
      division
    ) subdiv_list
  from
    source_table
  group by
    userid, usertype, division
)
pivot (
  max(subdiv_list) for division in ('Div1', 'Div2') 
)

SQLFidlle

P.S。就像一个侧面故事一样,动态生成列列表可能很有用。查看this SO article