0

我有以下表格:

在此处输入图像描述

架构

tbl_semester_empid {id,semester_name varchar(50),start_date}

tbl_batch_empid {id,term_id,batch_name,session_room}

tbl_associate_empid {id, associate_name,batch_id,联系,join_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 个学生的那些学期的记录,如果该学期没有学生,则不显示该学期的信息):

在此处输入图像描述

我希望在 Associates Count 列中没有员工的学期为 0。所以我用两个 LEFT OUTE 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 
         LEFT OUTER JOIN TBL_ASSOCIATE_593932 a ON a.BATCH_ID=b.ID  
                GROUP BY s.ID;

然而结果很奇怪:

在此处输入图像描述

4

2 回答 2

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
于 2013-01-09T06:31:57.643 回答
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 更正了最后一个查询。

于 2013-01-09T06:43:54.517 回答