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

Oracle-在数据透视表中查找数据,oracle,pivot,Oracle,Pivot,我有一个表,其列如下: 用户ID、用户类型、部门、细分 对于每个用户标识,将有一个或多个用户类型(例如,用户可以是开发人员或管理员,或两者兼有)。根据用户类型,用户可以订阅分区和可选的分区。 USERID、USERTYPE和DIVISION不是空列 需要以下格式的输出- 用户ID、用户类型、分区1、分区2、分区3。。等等 因此,USERID-USERTYPE组合应该有一个唯一的记录。 为此,我使用了PIVOT操作符,它工作得很好。我还创建了一个临时表(比如表1)来存储这个查询的结果 现在,如果用

我有一个表,其列如下:
用户ID、用户类型、部门、细分

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

需要以下格式的输出-

  • 用户ID、用户类型、分区1、分区2、分区3。。等等
    因此,USERID-USERTYPE组合应该有一个唯一的记录。 为此,我使用了PIVOT操作符,它工作得很好。我还创建了一个临时表(比如表1)来存储这个查询的结果
  • 现在,如果用户订阅了子分区,则子分区的值应作为逗号分隔的值写入该分区下。如果未订阅细分,则其相应列下将显示简单的细分
    我已经使用listag函数编写了一个查询,它为每个USERID-USERTYPE组合提供了逗号分隔的细分。此查询的结果存储在表2中
  • 现在,当我加入关于USERID和USERTYPE的表Table1和Table2时,我得到了单个USERID-USERTYPE组合的多行,这是显而易见的,但不是需要的

    以下是一些示例数据:


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

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

    我确信我在这里遗漏了一些小问题,但我不知道是什么
    任何建议或指点都会大有帮助。

    提前感谢。

    无需在pivot查询中列出所有细分,只需将其聚合在一组独特的
    USERID、USERTYPE、DIVISION组合中,然后使用
    nvl(聚合值,DIVISION)
    获得填充pivot表的值

    如果
    source\u 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') 
    )
    


    另外,动态生成列列表可能会很有用,这只是一个小故事。检查

    pivot查询中不需要列出所有子部分,只需将其聚合在一组独特的组合中,这些组合包括
    USERID、USERTYPE、DIVISION
    ,并使用
    nvl(聚合值,DIVISION)
    来获取填充pivot表的值

    如果
    source\u 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') 
    )
    


    另外,动态生成列列表可能会很有用,这只是一个小故事。检查

    嗨,ThinkJet,这很有魅力!非常感谢您的快速回复。@Leonine总是乐于回答精心设计的问题。嗨,ThinkJet,这很有魅力!非常感谢您的快速回复。@Leonine总是乐于回答精心设计的问题。