我有几个部门提交的数据,我需要总结一下,以便在报告中输出。
大多数时候,每个部门都会提交数据。有时候,某个部门可能会错过提交数据。
我需要在当天反映该部门的零值条目,而不是跳过它。
我不知道为什么,但这对我来说是一个艰难的挑战。
如果我的数据如下:
Date, Department, Employee
1 May 2016, First, Fred
1 May 2016, First, Wilma
1 May 2016, Second, Betty
1 May 2016, Second, Barney
2 May 2016, Second, Betty
3 May 2016, First, Wilma
3 May 2016, Second, Betty
3 May 2016, Second, Barney
如果我对这些数据进行计数(*),我希望的输出是:
1 May 2016, First, 2
1 May 2016, Second, 2
2 May 2016, First, 0
2 May 2016, Second, 1
3 May 2016, First, 1
3 May 2016, Second, 2
它是第3行," 2016年5月2日,第一,0",我无法将我的输出包括在内。
我的基础数据比上面的更复杂,但上面是问题的合理单一表示。
我正处理那些试图建立'游戏的游标。这个记录集,所以我认为这是一个我需要寻求帮助的线索。
答案 0 :(得分:1)
假设你的主表是:
create table mydata
(ReportDate date,
department varchar2(20),
Employee varchar2(20));
我们可以使用以下查询:
with dates (reportDate) as
(select to_date('01-05-2016','dd-mm-yyyy') + rownum -1
from all_objects
where rownum <=
to_date('03-05-2016','dd-mm-yyyy')-to_date('01-05-2016','dd-mm-yyyy')+1 ),
departments( department) as
( select 'First' from dual
union all
select 'Second' from dual) ,
AllReports ( reportDate, Department) as
(select dt.reportDate,
dp.department
from dates dt
cross join
departments dp )
select ar.reportDate, ar.department, count(md.employee)
from AllReports ar
left join myData md
on ar.ReportDate = md.reportDate and
ar.department = md.department
group by ar.reportDate, ar.department
order by 1, 2
首先我们生成我们感兴趣的日期。在我们的样本中,在01-05-2016和03-05-2016之间。它在dates WITH
。
接下来,我们会生成部门列表 - Departments WITH
。
我们交叉加入它们以生成所有可能的报告 - AllReports WITH
。
我们在您的主表中使用LEFT JOIN
来确定哪些数据存在以及哪些数据丢失。