2013-06-28 44 views
2

獲取數據I具有下表佈局DB2查詢而從3表

表一個

Teacher Students 
Mohan pankaj 
Mohan sudeepa 
Mohan sujitra 
Mohan Sumit 

表B(學期1馬克)

Pankaj Maths 50 
Pankaj English 40 
Pankaj Physics 60 
Sudeepa Chemisty 40 
Sujitra Physic 10 
Sujitra English 40 
Sujitra Hindi 70 

表c(學期2分)

Pankaj Chemistry 50 
Pankaj English 40 
Pankaj Physics 60 
Sudeepa Science 40 
Sujitra Physic 10 
Sujitra Maths 40 
Sujitra Hindi 70 

我想作爲輸出: -

hindi 140.00 
maths 40.00 
physics 10.00 
science 40.00 
chemistry 40.00 
english 40.00 
physics 10.00 

我寫的查詢

select subject,sum(marks) from sample.b where 
student in (select student from sample.a where teacher='mohan') 
group by subject 

union all 
select subject,sum(marks) from sample.c 
where student in (select student from sample.test where teacher='mohan') 
group by subject 

我得到的結果作爲

hindi 70.00 
maths 40.00 
physics 10.00 
science 40.00 
chemistry 40.00 
english 40.00 
hindi 70.00 
physics 10.00 

* 發行 *Same subjects marks are not adding up ..

+0

請注意,您的數據庫設計存在問題 - 您是否計劃爲_every_不同學期添加一張表?你最好擁有一張「Class_Taken」表(或類似的表),並在學年和學期增加一些額外的專欄。 –

回答

0

UPDATE你的查詢可能看起來像

SELECT s.subject, s1.marks sem1_marks, s2.marks sem2_marks 
FROM 
(
    SELECT b.subject 
    FROM b JOIN a 
     ON b.student = a.students 
    WHERE a.teacher = 'Mohan' 
    UNION 
    SELECT c.subject 
    FROM c JOIN a 
     ON c.student = a.students 
    WHERE a.teacher = 'Mohan' 
) s 
LEFT JOIN 
(
    SELECT b.subject, SUM(b.marks) marks 
    FROM b JOIN a 
     ON b.student = a.students 
    WHERE a.teacher = 'Mohan' 
    GROUP BY b.subject 
) s1 ON s.subject = s1.subject 
LEFT JOIN 
(
    SELECT c.subject, SUM(c.marks) marks 
    FROM c JOIN a 
     ON c.student = a.students 
    WHERE a.teacher = 'Mohan' 
    GROUP BY c.subject 
) s2 ON s.subject = s2.subject 

輸出:

 
| SUBJECT | SEM1_MARKS | SEM2_MARKS | 
--------------------------------------- 
| Chemistry |   40 |   50 | 
| English |   80 |   40 | 
|  Hindi |   70 |   70 | 
|  Maths |   50 |   40 | 
| Physics |   70 |   70 | 
| Science |  (null) |   40 | 

這裏是SQLFiddle演示(再次SQL服務器但應該工作DB2)。

原始答案原來的問題: 您需要在內部選擇第一UNION ALL兩個數據集(或聚集或沒有),然後在外部選擇應用的聚合SUM()GROUP BY

SELECT subject, SUM(marks) marks 
FROM 
(
    SELECT student, subject, marks 
    FROM b JOIN a 
     ON b.student = a.students 
    WHERE a.teacher = 'Mohan' 
    UNION ALL 
    SELECT student, subject, marks 
    FROM c JOIN a 
     ON c.student = a.students 
    WHERE a.teacher = 'Mohan' 
) q 
GROUP BY subject 

輸出:

 
| SUBJECT | MARKS | 
--------------------- 
| Chemistry | 90 | 
| English | 120 | 
|  Hindi | 140 | 
|  Maths | 90 | 
| Physics | 140 | 
| Science | 40 | 

這裏是SQLFiddle演示(SQL服務器)。 但我相信它在DB2中應該是一樣的。

+0

@coolpinky有幫助嗎? – peterm

+0

對不起...需求略有變化..我想assubject SEM1標記sem2標記輸出 化學90 50 英語80 40 物理70 70 印地文70 70 科學40個 數學40 – coolpinky

+0

對不起...。在requirement..I略有變化要輸出assubject SEM1標記sem2標記 化學90 50 英語80 40 物理70 70 印地文70 70 科學40個 數學40受試者我需要的所有科目列表,需要加起來的SEM1所有商標和SEM 2 – coolpinky

0

這應該會給你你要求的東西,把成績分成不同的欄目。

Select subject, sum(s1mark) sem1tot, sum(s2mark) sem2tot 
From (select subject, mark as s1mark, 0 as s2mark 
     From b join a on a.student=b.student and a.teacher='Mohan' 
     UNION 
     select subject, 0 as s1mark, mark as s2mark 
     From b join a on a.student=b.student and a.teacher='Mohan' 
    ) 
group by subject 
order by subject