即使部门缺少一天,也可以获得摘要数据

时间:2016-06-06 02:39:27

标签: sql oracle oracle11g

我有几个部门提交的数据,我需要总结一下,以便在报告中输出。

大多数时候,每个部门都会提交数据。有时候,某个部门可能会错过提交数据。

我需要在当天反映该部门的零值条目,而不是跳过它。

我不知道为什么,但这对我来说是一个艰难的挑战。

如果我的数据如下:

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",我无法将我的输出包括在内。

我的基础数据比上面的更复杂,但上面是问题的合理单一表示。

我正处理那些试图建立'游戏的游标。这个记录集,所以我认为这是一个我需要寻求帮助的线索。

1 个答案:

答案 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来确定哪些数据存在以及哪些数据丢失。