2010-03-01 68 views
0

Report Builder 2.0中,我试图创建一个表像下面的数据:报表生成器2.0或Oracle串聚集

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 

依此类推。我无法在Oracle中使用LISTAGG(如this tutorial中所述),也不能使用EXPLAIN PLAN或告诉您使用的是哪个版本的Oracle,因为我必须通过非常有限的接口访问数据库。我查看了Report Builder的功能,如Aggregate,但无法找到将多个字符串值与聚合函数连接在一起的方法。如果我通过Person创建表组,我会为每个StrID获取单独的行。使用Join(Fields!StrID.Value, ", ")会导致表格单元格中出现“#Error”,我假设因为Fields!StrID.Value实际上并不是多值字段,所以它是每个人的单个值。

任何人都可以告诉我一种方法,通过SQL或报表生成器2.0/Visual Basic显示一行中关联的StrID的列表?

编辑:我可以使用LAG function,如果任何人都可以使用它的想法创造性的解决方案。原来我也可以使用PARTITION BYLAG函数。

回答

0

找出了LAG功能的工作后,我想我也许能得到一个StrID和前行的StrID,串联在一起,然后以某种方式继续这样做,对所有行的Person。我发现this AskTom question,并能适应它与我的表的工作:

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 
0

我看过Tom Kyte's网站?如果您搜索“数据透视”,结果可能会有所帮助。

例如

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的!),所以我不能肯定,这将工作在你的环境中。

+0

第一个例子不会为我工作,因为它在一组静态字段上转动,而我的每个StrID都需要有字段,这不是静态的。 – 2010-03-01 20:06:05