1

Oracle-Noob の質問で申し訳ありませんが、実行しようとしているクエリに問題があり、その書き方がわかりません。

クエリを 2 つの部分に分割すると、それぞれに正しい情報が得られます。見る:

select   NVL (skill.category, 'Total:') "Skill Category",
         count (training.code) "# of Trainings"
from     skill join training on skill.code = training.code
group by rollup (skill.category);

戻り値:

Skill Category  # of Trainings
--------------- --------------
Database                     2
HR                           1
Leadership                   1
Printing                     1
Sales                        3
Web Design                   5
Total:                      13

同様に、2 番目のクエリで次の結果が得られます。

select NVL (skill.category, 'Total:') "Skill Category",
       count (project.code) "projects req training"
from   skill join project on skill.code = project.code
group by rollup (skill.category);

Skill Category  projects req training
--------------- ---------------------
Database                            2
Printing                            3
Web Design                          5
Total:                             10

ただし、これらのクエリを組み合わせようとすると、結果が台無しになります。

select NVL (skill.category, 'Total:') "Skill Category",
           count (training.code) "# of Trainings",
           count (project.code) "Projects Requiring Skill"
from skill join training on skill.code = training.code
           left join project on training.code = project.code
group by rollup (skill.category);

Skill Category  # of Trainings Projects Requiring Skill
--------------- -------------- ------------------------
Database                     4                        4
HR                           1                        0
Leadership                   1                        0
Printing                     3                        3
Sales                        3                        0
Web Design                  13                       13
Total:                      25                       20

ここで間違っていることは何ですか? 何か助けていただければ幸いです。明らかな何かが欠けている場合は申し訳ありません。

4

1 に答える 1

0

問題は、あなたの結合がデータを乗算することです。スキルとトレーニングの間、およびトレーニングとプロジェクトの間に 2 つの 1 対 n の関係があります。結果は、組み合わせの乗算です。

解決策は、2 つの集計を別々に行い、結合を使用してそれらを結合することです。

select st.*, "projects req training"
from (select NVL(skill.category, 'Total:') "Skill Category",
             count(training.code) "# of Trainings"
      from skill left outer join
           training
           on skill.code = training.code
      group by rollup (skill.category)
     ) st join
     (select NVL(skill.category, 'Total:') "Skill Category",
             count(project.code) "projects req training"
      from skill left outer join
           project
           on skill.code = project.code
      group by rollup (skill.category)
     ) sp
     on st."Skill Category" = sp."Skill Category"

このバージョンでleft outer joinは、サブクエリで を使用して、各サブクエリがすべてのスキルを確実に返すようにします。これによりinner join、次のレベルで を使用できます。rollup外部で追加の集計を行う代わりに、サブクエリにを残しました。

于 2012-12-04T03:09:41.853 に答える