【问题标题】:Db2 query while fetching data from 3 table从 3 个表中获取数据时的 Db2 查询
【发布时间】: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”表(或类似表),并为学年和学期添加几个额外的列。

标签: sql database db2


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-10
    • 2022-01-13
    • 2021-02-28
    • 1970-01-01
    • 1970-01-01
    • 2019-01-07
    • 1970-01-01
    • 2012-12-31
    相关资源
    最近更新 更多