Sql 当计数为空时,将默认值设置为零

Sql 当计数为空时,将默认值设置为零,sql,oracle11g,Sql,Oracle11g,我试图计算班次等于“关”的天数,但当计数为零或一个月没有“关”班次时,它不会显示记录。当count为null或月份没有“OFF”移位时,如何将值设置为零。如果不知道数据模型,我无法理解您的查询(为什么在2016年使用古老的(+)语法进行外部联接?!),但一般原则很简单。groupby查询仅返回具有某些数据的组的行。例如: select rd.description||'('||rs.department_code||')' DepartmentName, rd.co

我试图计算班次等于“关”的天数,但当计数为零或一个月没有“关”班次时,它不会显示记录。当count为null或月份没有“OFF”移位时,如何将值设置为零。

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

 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')
这将仅返回至少有一名员工的部门的行。但你说“我想看看所有部门,即使他们没有员工”。嗯,EMP表不包含所有的部门,但DEPT表包含所有的部门。因此,我们可以使用外部联接(我将使用ANSI语法),如下所示:

select deptno, count(*)
  from emp
 group by deptno;
请注意,驱动表已从EMP(不包含所有deptno值)更改为DEPT(包含所有deptno值)。如果deptno=60没有员工,则由于外部联接,查询仍将返回该部门的一行

还请注意,我使用了
count(e.empno)
而不是
count(*)
,因为我试图统计部门中的员工,而不是分组前查询返回的行。如果我使用了
count(*)
,那么deptno=60将返回一个1的计数(因为有一个deptno=60的DEPT行,外部连接到0个EMP行,从而产生一个结果)


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

您有一个包含不同类型的可用移位的表吗?是,但是OFF是在另一个表中声明的,您可能需要使用LEFT-JOIN并将WHERE-into转换为,我将围绕保存移位类型的表构建查询。这样,您将始终拥有移位类型,然后在NVL中使用计数进行左外连接。然后,如果non在OFF shift.LOL中使用了古代(+)语法,那么您将始终显示为OFF和zero
select d.deptno, count(e.empno)
  from dept d
       left join emp e on e.deptno = d.deptno
 group by d.deptno;