2013-01-09 111 views
0

我有以下表:与列值0显示记录时没有记录

enter image description here

架构

tbl_semester_empid {ID,semester_name VARCHAR(50),起始日期}

tbl_batch_empid {id,semester_id,batch_name,session_room}

tbl_associate_empid {id,associate_name,batch_id,contact,joining_date,induction_result,stream_result int}

问题查询是:显示学期明智的关联计数。

我已经写了3个查询:

--basic query 
SELECT s.ID "Semester Id", COUNT(*) "Associate Count" FROM TBL_SEMESTER_593932 s, TBL_ASSOCIATE_593932 a, TBL_BATCH_593932 b 
     WHERE s.ID=b.SEMESTER_ID AND a.BATCH_ID=b.ID 
       GROUP BY s.ID; 

--used NVL function 
SELECT s.ID "Semester Id", NVL(COUNT(*),0) "Associate Count" FROM TBL_SEMESTER_593932 s, TBL_ASSOCIATE_593932 a, TBL_BATCH_593932 b 
     WHERE s.ID=b.SEMESTER_ID AND a.BATCH_ID=b.ID 
       GROUP BY s.ID; 

-- used LEFT OUTER JOIN and JOIN 
SELECT s.ID "Semester Id", NVL(COUNT(*),0) "Associate Count" 
     FROM TBL_SEMESTER_593932 s LEFT OUTER JOIN TBL_BATCH_593932 b ON s.ID=b.SEMESTER_ID 
      JOIN TBL_ASSOCIATE_593932 a ON a.BATCH_ID=b.ID 
        GROUP BY s.ID; 

所有这些显示以下输出(其显示对应于仅在其至少1名学生,如果泰斯在那个学期没有学生的学期记录,不显示任何信息,这学期):

enter image description here

我想在同事与他们没有任何关联的学期为0数列。所以,我想有两个LEFT OUTE同一连接:

SELECT s.ID "Semester Id", NVL(COUNT(*),0) "Associate Count" 
    FROM TBL_SEMESTER_593932 s LEFT OUTER JOIN TBL_BATCH_593932 b ON s.ID=b.SEMESTER_ID 
     LEFT OUTER JOIN TBL_ASSOCIATE_593932 a ON a.BATCH_ID=b.ID 
       GROUP BY s.ID; 

然而结果是怪异:

enter image description here

回答

1

基本上,你必须做什么是使用所有可用的学期列表,然后计算每一个量:

select s.ID, 
     s.Semester_Name, 
     NVL ((select count(*) 
      from TBL_ASSOCIATE_593932 a 
       join TBL_BATCH_593932 b 
       on a.BATCH_ID=b.ID 
     where s.ID=b.SEMESTER_ID 
     ),0) as Amount 
from TBL_SEMESTER_593932 s 

另一种方法是左侧的接合部所有学期的名单再算上

select s.ID, 
     s.Semester_Name, 
     count(*) as Amount 
from TBL_SEMESTER_593932 s 
     left join (
      TBL_BATCH_593932 b 
      join TBL_ASSOCIATE_593932 a 
      on a.BATCH_ID=b.ID) 
      on s.ID=b.SEMESTER_ID 

group by s.ID, s.Semester_Name 
order by s.ID 

[编辑]:根据@ Mahesha999最后查询已得到纠正。

+0

第一个查询很棒,它按照期望的方式工作,但是第三个查询的结果不是很好,它应该是'来自TBL_SEMESTER_593932的左连接** TBL_BATCH_593932 b **在s.ID = b.SEMESTER_ID连接** TBL_ASSOCIATE_593932 a **在a.BATCH_ID = b.ID'上。然而,这与我最后一次查询类似,没有显示没有学生的学期记录 – Mahesha999

+0

@ Mahesha999:感谢您向我展示错误:我相应地更正了查询。 – alzaimar

+0

,但它仍然没有显示与他们没有关联的学期的记录:( – Mahesha999

1

您是否尝试过使用CASE when

根据您的关联表中的数据,也有所有批次/学期的记录。

那么试试这个,还有您的NVL类似情况......

select s.id, s.name, CASE WHEN count(a.id) IS NULL THEN 0 ELSE count(a.id) END as ACount 
from tblsem s 
left join tblbatch b 
on b.sid = s.id 
left join tblaso a 
on b.id = a.batchid 
group by s.id, s.name 
; 

结果:

ID NAME ACOUNT 
1 sem1 4 
2 sem2 3 
3 sem3 0 
+0

添加的架构,只是看到原来的问题,会尽量情况下,并更新 – Mahesha999

+0

无法想到我应该如何使用CASE,一个很好的例子是[这里](http://msdn.microsoft.com/en-我们/库/ ms181765。aspx),但仍然无法通过 – Mahesha999

+0

@ Mahesha999忘记案件。 :)因为Oracle NVL也是这样做的,但是试试吧。我还会为您提供一些其他信息。 – bonCodigo