Oracleの2つのテーブルから階層データを取得するにはどうすればよいですか?


8

table1とtable2の2つのテーブルがあります。両方のテーブルを結合して階層的な出力が必要です。

Table1には3つのカテゴリCAT1、CAT2、およびCAT3が含まれ、1つの外部キー、つまりF_IDがもう1つのテーブルtable2の主キーであり、もう1つの列、つまりVALが含まれています。

TABLE 1
-----------------
CAT1        CAT2        CAT3        F_ID
A           a           aa          1
A           a           ab          2
A           b           ba          3
A           b           bb          4
B           c           ca          5
B           c           cb          6
B           d           da          7


TABLE 2
-------------------
F_ID    VAL
1       4
2       6
3       4
4       1
5       6
6       6
7       9

ここで、すべてのカテゴリとサブカテゴリにVALの合計が含まれる以下の形式のデータが必要です。

Need Data in below Format from the above table
----------------------------------------------
A       -       -       15
A       a       -       10
A       a       aa      4
A       a       ab      6
A       b       -       5
A       b       ba      4
A       b       bb      1
B       -       -       21
B       c       -       12  
B       c       ca      6
B       c       cb      6
B       d       -       9
B       da      da      9

私を助けてください。

回答:


6

グループ化セットを使用しますこちらでお試しいただけます

select cat1, cat2, cat3, sum(val) as val
  from t1 join t2 on t1.f_id = t2.f_id
group by grouping sets ((cat1),(cat1, cat2),(cat1, cat2, cat3))
order by cat1, cat2 nulls first, cat3 nulls first

出力

cat1 cat2 cat3 val
A           15
A   a       10
A   a   aa  4
A   a   ab  6
A   b       5
A   b   ba  4
A   b   bb  1
B           21
B   c       12
B   c   ca  6
B   c   cb  6
B   d       9
B   d   da  9

null使用するよりもアンダースコアを好む場合NVL

select cat1, nvl(cat2,'_') as cat2, nvl(cat3, '_') as cat3, sum(val)
  from t1 join t2 on t1.f_id = t2.f_id
group by grouping sets ((cat1),(cat1, cat2),(cat1, cat2, cat3))
order by cat1, cat2 nulls first, cat3 nulls first

4
別のオプションgroup by cat1, rollup(cat2, cat3)
Andriy M

5
@AndriyMか:group by rollup(cat1, cat2, cat3) having grouping(col1)=0
ypercubeᵀᴹ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.