1

我有一个表,其列如下:
USERID、USERTYPE、DIVISION、SUBDIVISION

对于每个用户标识,将有一个或多个用户类型(例如,用户可以是开发人员或管理员或两者兼而有之)。根据用户类型,用户可以订阅部门和可选的子部门。
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,因为稍后在构建枢轴查询时,列出所有可能的细分组合太乏味了。

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

4

1 回答 1

1

无需列出透视查询中的所有细分,只需将其聚合在一组独特的组合中,USERID, USERTYPE, DIVISION并用于nvl(AGGREGATED_VALUE,DIVISION)获取填充透视表的值。

如果source_tableUSERID, 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') 
)

SQLFiddle

PS 顺便说一句,动态生成列列表可能很有用。检查这篇 SO 文章

于 2013-06-20T23:04:25.323 回答