0

我正在尝试在我想要的地方执行大型查询:

  1. 查询明细行,然后

  2. 根据返回的结果执行聚合

本质上,我想执行我的数据密集型查询一次,并从一个查询中获取摘要值和详细信息值,因为查询非常密集。我确信有更好的方法可以使用前端应用程序(例如 SQL 中的详细行,前端聚合?),但我想知道如何在 PL/SQL 中使用基本上一个选择来完成这一切针对数据库(出于性能原因,我不想调用本质上相同的大 Select 两次)(此时,我想要在一个查询中执行此操作的原因可能被称为固执......即即使有一个更好的方法,我想知道它是否可以完成)。

我知道如何获得基本的“细节级别”结果集。该查询将返回如下数据:

UPC-Region-ProjectType-TotalAssignments-IncompleteAssignments

所以说我有10条记录:

10-AX-20-10

11-BX-10-5

12-CY-30-15

13-CZ-20-10

14-AY-10-5

15-BX-30-15

16-CZ-20-10

17-10-5

18-CZ-30-15

19-AX-20-10

20-BX-10-5

我希望能够执行查询,然后对该结果集执行聚合,例如:

A区项目:3

A区总分配:50

A区未完成分配:25

B区...

C区...

项目类型 X 项目:5

项目类型 X 总分配:90

项目类型 X 未完成分配:45

项目类型 Y...

项目类型 Z...

然后将两个结果集(摘要 + 详细信息)返回给调用应用程序。

我想这个想法是将详细信息查询运行到临时表中,然后在那里选择/执行聚合以构建第二个“摘要级别”查询。然后将两个结果集作为两个引用返回。

但我对想法持开放态度......

我最初的尝试是:

type rec_projects is record
   (record matching my DetailsSQL)

/* record variable */
project_resultset rec_projects;

/* cursor variable */
OPEN cursorvar1 FOR
  select 
    upc,
    region,
    project_type,
    tot_assigns,
    incompl_assigns
    ...

然后我:

loop
  fetch cursorvar1 into project_resultset;  
  exit when cursorvar1%NOTFOUND;

  /* perform row-by-row aggregations into variables */
  If project_resultset.region = 'A'
  then
    numAProj        := numAProj + 1;
    numATotalAssign := numATotalAssign + project_resultset.Totassigns;
    numAIncomplAssign := numAIncomplAssign + project_resultset.Incomplassigns;
  and so on...

 end loop;

然后打开另一个 refcursor var - 从 DUAL 中选择变量:

open cursorvar2 for
  select
     numAProj, numATotalAssign, numAIncomplAssign, etc, etc from dual;

最后:

cur_out1 := cursorvar1;
cur_out2 := cursorvar2;

不工作... cursorvar1 似乎加载正常,我进入循环。但是我没有在 cursorvar2 中得到任何结果,只是觉得我可能完全走错了路(有更好的方法来做到这一点)

谢谢你的帮助。

4

2 回答 2

1

我更喜欢在服务器端进行所有计算。
两种类型的信息(详细信息+主信息)都可以通过单个游标获取:

with
   DET as (
      -- your details subquery here
      select
         UPC,
         Region,
         Project_Type,
         Total_Assignments,
         Incomplete_Assignments
      from ...
   )
select
   UPC,
   Region,
   Project_Type,
   Total_Assignments,
   Incomplete_Assignments,
   null as projects_ctr
from DET

union all

select
   null as UPC,
   Region,
   null as Project_Type,
   sum(Total_Assignments) as Total_Assignments,
   sum(Incomplete_Assignments) as Incomplete_Assignments,
   count(0) as projects_ctr
from DET
group by Region

union all

select
   null as UPC,
   null as Region,
   Project_Type,
   sum(Total_Assignments) as Total_Assignments,
   sum(Incomplete_Assignments) as Incomplete_Assignments,
   count(0) as projects_ctr
from DET
group by Project_Type

order by UPC nulls first, Region, Project_Type

结果:

UPC     Region  Project_Type  Total_Assignments  Incomplete_Assignments  Projects_Ctr
------  ------  ------------  -----------------  ----------------------  ------------
(null)  A       (null)        50                 25                      3
(null)  B       (null)        60                 30                      4
(null)  C       (null)        100                50                      4
(null)  (null)  X             90                 45                      5
(null)  (null)  Y             50                 25                      3
(null)  (null)  Z             70                 35                      3
10      A       X             20                 10                      (null)
11      B       X             10                 5                       (null)
12      C       Y             30                 15                      (null)
13      C       Z             20                 10                      (null)
14      A       Y             10                 5                       (null)
15      B       X             30                 15                      (null)
16      C       Z             20                 10                      (null)
17      B       Y             10                 5                       (null)
18      C       Z             30                 15                      (null)
19      A       X             20                 10                      (null)
20      B       X             10                 5                       (null)

小提琴

于 2013-03-19T22:58:04.017 回答
1

如果您要定期创建这些报告,最好创建一个全局临时表来存储初始查询的结果:

CREATE GLOBAL TEMPORARY TABLE MY_TEMP_TABLE
    ON COMMIT DELETE ROWS 
    AS 
        SELECT 
            UPC,
            Region,
            ProjectType,
            TotalAssignments,
            IncompleteAssignments 
        FROM WHEREVER
;

然后,您可以运行一系列后续查询来计算报表的各种统计值,并以大文本表以外的格式输出它们。

于 2013-03-20T01:22:09.303 回答