从 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 查询的主要内容,如果未能解决你的问题,请参考以下文章

用于从 3 个表中获取数据的 LINQ 查询

如何根据搜索关键字 rails 从 2 个表中获取数据

从 2 个表中获取数据到 excel 表中

Laravel:如何从具有关系的 3 个表中获取数据

同时从四个表中获取按日期分组的聚合值

如何通过匹配一些冗余字段从 3 个表中获取唯一数据?