2012-12-04 29 views
1

對不起,Oracle-Noob問題,但我有一個問題,我試圖運行一個查詢,似乎無法弄清楚如何編寫它。在oracle中計數 - 我在做什麼錯誤

如果我把我的查詢分成兩部分,我會得到每個部分的正確信息。請參閱:

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 

同樣地,我得到的第二個查詢如下:

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 

然而,當我嘗試將這些查詢組合,我的成績就會上當受騙up:

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 

我是什麼在這裏做錯了嗎?我非常感謝任何幫助,如果我錯過了某些明顯的事情,我很抱歉!

回答

0

問題是你的連接數乘以一個數。你有兩種1-n關係,技能和培訓之間以及培訓和項目之間。結果是組合的乘法。

的解決方法是分別做兩個總結,然後使用連接將它們組合起來:

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留在子查詢中,而不是在外部進行額外的聚合。

+0

我不能非常感謝你的幫助!現在我正在看它,你的解決方案非常有意義。再次感謝! – Sierra62