当count为null时,将默认值设置为零

时间:2016-03-08 10:23:14

标签: sql oracle11g

 select rd.description||'('||rs.department_code||')' DepartmentName,
              rd.code DepartmentCode,
              rs.description||'('||emv.section_code||')' SectionName,
              emv.section_code SectionCode,
              rsg.description||'('||emv.staff_group_code||')' StaffGroupName,
              emv.staff_group_code StaffGroupCode,
              e.staff_id STAFFID,
              e.surname || ', ' || e.given_name FullName,
              hp.description Position,
              het.description EmploymentType,
              to_char(e.Join_Date, 'dd/MM/yyyy') JoinDate,
              e.employee_no EmployeeNo,
              edt.shift Type,
              to_char(edt.timesheet_date,'Mon') Mth,
              to_char(to_Date(edt.timesheet_date),'mm') MthNum,
              nvl(count(*), 0) Days
        FROM employee e,
            employee_daily_timesheet edt,
            employee_assignment_vw emv,
            ref_section rs,
            ref_department rd,
            hris_position hp,
            hris_employment_type het,
            ref_staffgroup rsg
        WHERE e.employee_no = emv.employee_no
        AND edt.assignment_no = emv.assignment_no
        AND to_char(timesheet_date,'yyyy')=TO_CHAR(TO_DATE('01/31/2015','MM/dd/yyyy'),'yyyy')
        AND  emv.section_code = rs.code
        AND rs.department_code = rd.code
        AND e.position_code = hp.code(+)
        AND e.employment_type_code = het.code(+)
        AND emv.staff_group_code = rsg.code
        AND edt.shift='OFF'
        GROUP BY  rd.description||'('||rs.department_code||')',
                  rd.code,
                  rs.description||'('||emv.section_code||')',
                  emv.section_code,
                  rsg.description||'('||emv.staff_group_code||')',
                  emv.staff_group_code,
                  e.staff_id,
                  e.surname || ', ' || e.given_name,
                  hp.description ,
                  het.description ,
                  to_char(e.Join_Date, 'dd/MM/yyyy') ,
                  e.employee_no,
                  edt.shift,
                  to_char(edt.timesheet_date,'Mon'),
                   to_char(to_Date(edt.timesheet_date),'mm')

我试图计算Shift等于' OFF'的日子,但是当计数为零或一个月没有“关闭”时它不会显示记录。转移。当count为null或月份没有“关闭”时,如何将值设置为零?移。

1 个答案:

答案 0 :(得分:1)

在不知道数据模型的情况下我无法理解您的查询(为什么2016年您使用古代(+)语法进行外连接?!)但一般原则很简单。 group by查询仅返回具有某些数据的组的行。例如:

select deptno, count(*)
  from emp
 group by deptno;

这只会返回至少有一名员工的部门的行。但是你说"我想看到所有部门,即使他们没有员工也没有#34;。那么,EMP表并不包含所有部门,但表DEPT可以。所以我们可以使用外连接(我将使用ANSI语法),如下所示:

select d.deptno, count(e.empno)
  from dept d
       left join emp e on e.deptno = d.deptno
 group by d.deptno;

请注意,驱动表已从EMP(已经没有所有deptno值)更改为DEPT。如果deptno = 60没有员工,那么由于外部联接,查询仍然会为该DEPT返回一行。

另请注意,我使用了count(e.empno)而不是count(*),因为我正在尝试计算部门中的员工,而不是在分组之前查询返回的行。如果我使用count(*),则deptno = 60将返回1的计数(因为有1个DEPT行,deptno = 60,外部连接到0个EMP行,导致一个结果)。

如果您了解这个原则和数据模型,那么您应该能够为您的案例编写类似的查询。