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或月份没有“关闭”时,如何将值设置为零?移。
答案 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行,导致一个结果)。
如果您了解这个原则和数据模型,那么您应该能够为您的案例编写类似的查询。