0

在 Report Builder 2.0 中,我试图创建一个包含如下数据的表:

Person | StrID's
-------------------
Jim    | a, b, c, d
Mary   | h, k
Sue    | l, m, p, z

问题是我的 Oracle SQL 查询以以下格式返回数据:

Person | StrID
--------------
Jim    | a
Jim    | b
Jim    | c
Jim    | d
Mary   | h

等等。我无权使用本教程LISTAGG中描述的 Oracle 访问权限,也无法使用或告诉您我正在使用哪个版本的 Oracle,因为我必须通过非常有限的接口访问数据库。我研究了报表生成器的函数,例如但找不到将多个字符串值与聚合函数连接在一起的方法。如果我创建一个按人分组的表,我会为每个 StrID 获得单独的行。使用导致“#Error”出现在表格单元格中,我假设因为它实际上不是一个多值字段,它是每个人的单个值。EXPLAIN PLANAggregateJoin(Fields!StrID.Value, ", ")Fields!StrID.Value

谁能告诉我一种通过 SQL 或 Report Builder 2.0/Visual Basic 在一行中按人显示相关 StrID 列表的方法?

编辑:如果有人能想到一个创造性的解决方案, 我可以使用LAG 功能。原来我也可以PARTITION BY与该LAG功能一起使用。

4

3 回答 3

1

这里http://www.sqlsnippets.com/en/topic-11787.html 他们至少有 10 种方法,其中一些不需要创建额外的对象。您可以尝试其中的任何一个,看看它们是否适合您的 Oracle 版本。

于 2010-03-01T21:34:41.060 回答
0

在发现该LAG函数有效后,我想我可能能够获得 aStrID和前一行的StrID,将它们连接在一起,然后以某种方式继续对 a 的所有行执行此操作Person。我发现了这个 AskTom 问题,并能够对其进行调整以适用于我的表格:

SELECT Person, 
       SUBSTR(
         MAX(list) KEEP (DENSE_RANK FIRST ORDER BY lev DESC),
         2
       ) AS StrIDs
FROM ( 
       SELECT Person,
              SYS_CONNECT_BY_PATH(StrID, ', ') AS list,
              LEVEL AS lev
       FROM (
              SELECT Person,
                     StrID,
                     LAG(StrID, 1)
                       OVER (PARTITION BY Person ORDER BY StrID) AS prev_id
              FROM my_table
              WHERE other_conditions = 'blah blah'
            )
       START WITH prev_id IS NULL
       CONNECT BY PRIOR StrID=prev_id
     )
GROUP BY Person
ORDER BY Person

我现在以我期望的格式获取数据,即:

Person StrIDs
jeff   a, b, c
linda  k, l, m
于 2010-03-01T21:41:20.447 回答
0

我看过Tom Kyte 的网站?如果您搜索“pivot”,结果可能会有所帮助。

例如

http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:124812348063

或者

http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:15151874723724

不幸的是,我无法访问报告 2.0(幸运的是(?)我从 6i 开始!)所以我无法确认这是否适用于您的环境。

于 2010-03-01T19:50:35.267 回答