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