【问题标题】:Oracle - Look up for the data in pivoted tableOracle - 在数据透视表中查找数据
【发布时间】:2013-06-20 21:01:43
【问题描述】:

我有一个包含如下列的表:
USERID、USERTYPE、DIVISION、SUBDIVISION

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

需要以下格式的输出 -

  1. USERID、USERTYPE、DIVISION1、DIVISION2、DIVISION3 ..等
    所以,USERID-USERTYPE的组合应该有唯一的记录。 为此,我使用了工作正常的 PIVOT 运算符。我还创建了一个临时表(比如说 Table1)来存储这个查询的结果。
  2. 现在,如果用户订阅了细分,则细分的值应作为逗号分隔值写入该细分下。如果未订阅细分,则简单的细分将出现在其各自的列下。
    我使用 LISTAGG 函数编写了一个查询,它为每个 USERID-USERTYPE 组合提供了逗号分隔的细分。该查询的结果存储在表 2 中。

现在,当我在 USERID 和 USERTYPE 上加入表 Table1 和 Table2 时,我会为单个 USERID-USERTYPE 组合获得多行,这很明显,但不是必需的。

以下是一些示例数据:


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

另外,我不能在枢轴查询之前使用 LISTAGG,因为稍后在构建枢轴查询时,列出所有可能的细分组合太乏味了。

我确定我在这里遗漏了一些小点,但不知道是什么。
任何建议或指示都会有很大帮助。
提前致谢。

【问题讨论】:

    标签: oracle pivot


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

    附注顺便说一句,动态生成列列表可能很有用。检查this SO article

    【讨论】:

    • 嗨,ThinkJet,它的作用就像一个魅力!非常感谢您的快速回复。
    • @Leonine 总是乐于回答精心设计的问题。
    猜你喜欢
    • 2018-11-05
    • 1970-01-01
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多