2

私は3つのテーブルを持っています:

  • 階層構造を持つ2つ
    (再帰型の階層の「次元」など)。
  • 1つは合計データ(X列の「ファクト」など)です。

彼らはここにいます:

  1. DIM1(ID1、PARENT2、NAME1)
  2. DIM2(ID2、PARENT2、NAME2)
  3. 事実(ID1、ID2、X)

DIM1テーブルの例:

--        1   0  DIM1  
----      2   1  DIM1-A  
------    3   2  DIM1-A-A  
--------  4   3  DIM1-A-A-A  
--------  5   3  DIM1-A-A-B  
------    6   2  DIM1-A-B  
--------  7   6  DIM1-A-B-A  
--------  8   6  DIM1-A-B-B  
------    9   2  DIM1-A-C  
----     10   1  DIM1-B  
------   11  10  DIM1-B-C  
------   12  10  DIM1-B-D  
----     13   1  DIM1-C  

DIM2テーブルの例:

--        1   0  DIM2  
----      2   1  DIM2-A  
------    3   2  DIM2-A-A  
--------  4   3  DIM2-A-A-A  
--------  5   3  DIM2-A-A-B  
--------  6   3  DIM2-A-B-C  
------    7   2  DIM2-A-B  
----      8   1  DIM2-B  
----      9   1  DIM2-C  

FACTSテーブルの例:

 1   1  100  
 1   2   30  
 1   3  500  
 --    ................  
 13  9  200  

そして、DIM1の親(たとえばDIM1-A)とDIM2の親(たとえばDIM2-A)を指定し、次のようなレポートを生成する 唯一の SELECT場所を作成したいと思います。ID1=2ID2=2SELECT

Name_of_1 Name_of_2 Sum_of_X  
--------- --------- ----------  
DIM1-A-A  DIM2-A-A  (some sum)  
DIM1-A-A  DIM2-A-B  (some sum)  
DIM1-A-B  DIM2-A-A  (some sum)  
DIM1-A-B  DIM2-A-B  (some sum)  
DIM1-A-C  DIM2-A-A  (some sum)  
DIM1-A-C  DIM2-A-B  (some sum)  

CONNECT BYフレーズ、START WITHフレーズ、SUMフレーズ、GROUP BYフレーズ、OUTERまたはINNER(?)を使用したいJOIN。Oracle10.2の他の拡張機能は必要ありません。

言い換えると、「クラシック」SQL
のみ、および階層クエリ用のOracle拡張機能のみを使用します。

出来ますか?

いくつかの実験を試してみました。
「Connectby」、「inner join」、「sumwithOracle」を組み合わせて質問しました。

(これは非常に優れたソリューションですが、 1つの
ディメンションテーブル(「タスク」)に対してのみですが、1つのファクトテーブルに対してJOIN 2つのディメンションテーブルが必要です)が、成功しませんでした。

4

2 に答える 2

2

「いくらかの合計」はあまり説明的ではないので、なぜ必要なCONNECT BYのかまったくわかりません。

SELECT  dim1.name, dim2.name, x
FROM    (
        SELECT  id1, id2, SUM(x) AS x
        FROM    facts
        GROUP BY
                id1, id2
        ) f
JOIN    dim1
ON      dim1.id = f.id1
JOIN    dim2
ON      dim2.id = f.id2
于 2010-09-10T19:36:28.660 に答える
0

あなたがしようとしているのは、最上位の子によってグループ化された指定された行のすべての子のファクト テーブルの値の合計を取得することだと思います。これは、上記の例では、最初の行の結果が (DIM1-AA、DIM1-AAA、DIM1-AAB) と (DIM2-AA、DIM2-AAA、DIM2-AAB、DIM3) の交点の合計になることを意味します。 -AAC) は FACTS テーブルにあります。その仮定で、私は次の解決策にたどり着きました:

SELECT root_name1, root_name2, SUM(X)
FROM ( SELECT CONNECT_BY_ROOT(name1) AS root_name,
             id1
         FROM dim1
      CONNECT BY parent1 = PRIOR id1
      START WITH parent1 = 2) d1
     CROSS JOIN
     ( SELECT CONNECT_BY_ROOT(name2) AS root_name,
              id2
         FROM dim2
      CONNECT BY parent2 = PRIOR id2
      START WITH parent2 = 2) d2
     LEFT OUTER JOIN
     facts
     ON     d1.id1 = facts.id1
        AND d2.id2 = facts.id2
GROUP BY root_name1, root_name2

(これは、FACTS の列の名前が ID1、ID2、および X であることも前提としています。)

于 2010-09-10T21:05:26.357 に答える