【问题标题】:Report Builder 2.0 or Oracle string aggregationReport Builder 2.0 或 Oracle 字符串聚合
【发布时间】:2010-03-01 19:30:56
【问题描述】:

在 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

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

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

编辑:如果有人能想到一个创造性的解决方案,我可以使用LAG function。原来我也可以将PARTITION BYLAG 函数结合使用。

【问题讨论】:

    标签: oracle string reporting-services aggregate reportbuilder


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我看过Tom Kyte's 网站?如果您搜索“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 开始!)所以我无法确认这是否适用于您的环境。

      【讨论】:

      • 第一个示例不适用于我,因为它以一组静态字段为中心,而我的需要为每个单独的 StrID 提供字段,这不是静态的。
      【解决方案3】:

      在发现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
      

      【讨论】:

        猜你喜欢
        • 2013-07-04
        • 2016-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-17
        • 1970-01-01
        • 2013-10-28
        相关资源
        最近更新 更多