从 3 个表中获取数据时的 Db2 查询
Posted
技术标签:
【中文标题】从 3 个表中获取数据时的 Db2 查询【英文标题】:Db2 query while fetching data from 3 table 【发布时间】:2013-06-28 05:53:55 【问题描述】:我有以下表格布局
表a
Teacher Students
Mohan pankaj
Mohan sudeepa
Mohan sujitra
Mohan Sumit
表 b(第一学期分数)
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
..
【问题讨论】:
附带说明一下,您的数据库设计存在问题 - 您是否打算为每个不同的学期添加一个表格?最好有一个“Class_Taken”表(或类似表),并为学年和学期添加几个额外的列。 【参考方案1】:更新您的查询可能如下所示
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
输出:
|主题 | SEM1_MARKS | SEM2_MARKS | -------------------------------------- |化学 | 40 | 50 | |英语 | 80 | 40 | |印地语 | 70 | 70 | |数学 | 50 | 40 | |物理学 | 70 | 70 | |科学 | (空) | 40 |这里是 SQLFiddle 演示(同样是 SQL Server,但应该在 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
输出:
|主题 |标记 | --------------------- |化学 | 90 | |英语 | 120 | |印地语 | 140 | |数学 | 90 | |物理学 | 140 | |科学 | 40 |这里是 SQLFiddle 演示(SQL Server)。 但我相信它在 DB2 中应该也能正常工作。
【讨论】:
对不起...要求略有变化..我希望输出为主题 sem1 标记 sem2 标记化学 90 50 英语 80 40 物理 70 70 印地语 70 70 科学 40 数学 40 对不起...要求略有变化..我希望输出为主题 sem1 标记 sem2 标记化学 90 50 英语 80 40 物理 70 70 印地语 70 70 科学 40 数学 40 科目 I需要所有科目列表,需要将sem1和sem 2的所有分数相加 @coolpinky 这是一个相当大的需求变化。只是为了让你知道不鼓励在 SO 上做这样的事情(问一个问题,然后在你得到原始问题的答案后改变它)。无论如何,请参阅更新的答案以解决您的问题。 @coolpinky 有帮助吗?您的问题需要更多帮助吗?【参考方案2】:通过将成绩分成不同的列,这应该可以满足您的要求。
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
【讨论】:
以上是关于从 3 个表中获取数据时的 Db2 查询的主要内容,如果未能解决你的问题,请参考以下文章