0

次のような場所で大規模なクエリを実行しようとしています。

  1. 詳細行をクエリしてから、

  2. 返された結果に基づいて集計を実行します

基本的に、データ集約型のクエリを1回実行し、1つのクエリから要約値と詳細値の両方を取得します。これは、クエリが非常に集中的であるためです。フロントエンドアプリケーションを使用してこれを行うためのより良い方法があることは確かです(たとえば、SQLの詳細行、フロントエンドで集計しますか?)が、基本的に1つの選択を使用してPL/SQLでこれをすべて行う方法を知りたいですdbに対して(パフォーマンス上の理由から、基本的に同じラージSelectを2回呼び出したくない)(この時点で、1つのクエリでそれを実行したい理由は頑固と呼ばれる可能性があります...つまり、より良い方法、それができるかどうか知りたいです)。

基本的な「詳細レベル」の結果セットを取得する方法を知っています。このクエリは、次のようなデータを返します。

UPC-Region-ProjectType-TotalAssignments-IncompleteAssignments

つまり、10個のレコードがあるとします。

10-AX-20-10

11-BX-10-5

12-CY-30-15

13-CZ-20-10

10-5年度

15-BX-30-15

16-CZ-20-10

17-BY-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

プロジェクトタイプXIncompl割り当て:45

プロジェクトタイプY..。

プロジェクトタイプZ..。

次に、両方の結果セット(Summary + Detail)を呼び出し元のアプリケーションに返します。

詳細クエリを一時テーブルで実行し、そこで集計を選択/実行して、2番目の「要約レベル」クエリを作成するというアイデアだと思います。次に、2つの結果セットを2つのリフレクターとして返します。

しかし、私はアイデアを受け入れています...

私の最初の試みは次のとおりです。

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

これらのレポートを定期的に作成する場合は、最初のクエリの結果を格納するためのグローバル一時テーブルを作成することをお勧めします。

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 に答える
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 に答える