我有一个具有in参数和out游标的过程。该游标给出的结果如下所示:

0100 | 0
0130 | 1
0200 | 2
0230 | 0
...


第一列是静态时间代码。第二列是给定日期在该时间段内安排多少次计划的汇总。

该过程是:

PROCEDURE DAILYLOAD (datep IN DATE, results OUT SYS_REFCURSOR)
   AS
   BEGIN
   Open results for
      SELECT RUN_TIME_C, COUNT (SCH_RPT_I)
    FROM    ITS_SCH_RPT_RUN_TIME
         LEFT OUTER JOIN
            ITS_SCH_RPT
         ON (   RUN_TIME_C = RUN_TIME1_C
             OR RUN_TIME_C = RUN_TIME2_C
             OR RUN_TIME_C = RUN_TIME3_C)
   WHERE EXP_DATE_D IS NULL
         OR datep < exp_date_d AND datep > start_date_d AND SUSPENDED_USER='N'
            AND (   ( (TO_CHAR (datep, 'D') = 1) AND RUN_SUNDAY_C = 'Y')
                 OR ( (TO_CHAR (datep, 'D') = 2) AND RUN_MONDAY_C = 'Y')
                 OR ( (TO_CHAR (datep, 'D') = 3) AND RUN_TUESDAY_C = 'Y')
                 OR ( (TO_CHAR (datep, 'D') = 4) AND RUN_WEDNESDAY_C = 'Y')
                 OR ( (TO_CHAR (datep, 'D') = 5) AND RUN_THURSDAY_C = 'Y')
                 OR ( (TO_CHAR (datep, 'D') = 6) AND RUN_FRIDAY_C = 'Y')
                 OR ( (TO_CHAR (datep, 'D') = 7) AND RUN_SATURDAY_C = 'Y'))
GROUP BY RUN_TIME_C
ORDER BY RUN_TIME_C;
   END DAILYLOAD;


我想使用不同的参数从包装过程中多次调用此过程,以便可以得出每周的负荷和每月的负荷。从概念上讲,这可以通过将所有结果集通过诸如“ union all”之类的方法进行串联,然后通过将第一列的总和与第二列的总和进行分组来实现。

现在,我有类似

Dailyload(datep, results1);
Dailyload(datep + 1, results2);
...

OPEN results FOR
  SELECT run_time_c,
         SUM(rpt_option_i)
    FROM SELECT *
           FROM results1
         UNION ALL
         SELECT *
           FROM results2
         UNION ALL ...
         GROUP BY run_time_c
         ORDER BY run_time_c


我可以在Oracle中做到这一点吗?使用批量收集进行获取看起来很有希望,但是我没有找到在特定情况下使用它的好方法。

最佳答案

您可以作为一个联合来执行此操作,包括标识组的列。单个选择将或多或少地复制您的DailyLoad SP正在执行的操作。

 select foo.Mygroup, sum(foo.col1)
  from
 (
 select 'A' as MyGroup, col1 WHERE ...
 union all
 select 'B' as MyGroup, col1 WHERE ...
 union all
 select 'C' as MyGroup, col1 WHERE ...
 ) as Foo
 group by MyGroup


如果事先不知道组数,则可以构建一个符合此基本结构的动态sql语句。

如果组的数量太大以至于动态语句会太大,则可以使用存储过程,该过程将每个调用的结果与MyGroup列一起推送到临时表中。然后,您可以通过针对临时表的select语句来发布组。

关于sql - 如何在Oracle中合并结果集?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6228739/

10-11 03:37
查看更多