通过参考表生成缺少的报告提交

时间:2017-03-14 16:26:19

标签: sql sql-server-2014

我有一个SQL查询,我目前正在努力,我将非常感谢一些帮助。

以下是我工作过的观点的简化版本:

SELECT   a.Organisation_Name
         ,a.Org_Id
      ,b.Activity_month
      ,SUM(b.Activity_Plan) 'Plan_Activity'
      ,SUM(b.Activity_Actual) 'Actual_Activity'
      ,SUM(b.Price_Actual) 'Actual_Price'
      ,SUM(b.Price_Plan) 'Plan_Price'
      ,COUNT(b.Instances) AS 'Record_Count'
      ,CASE WHEN COUNT(b.Instances) > 0 THEN 'Yes' ELSE 'No' END AS Submitted
  FROM [ExampleDatabase].[dbo].[Organisation_Reference] a

  LEFT JOIN [ExampleDatabase].[dbo].[Report_Submissions] b
  ON a.Org_Id = b.Org_Id
    AND ([Exmaple_Code] LIKE ('X') or [Example_Code] = 'X')


WHERE a.Category_Flag = 1
AND a.Example_Code in ('X','X','X','X','X') 

  GROUP BY
      a.Organisation_Name
      ,a.Org_Id
      ,b.Activity_month

-

“活动月份”字段是整数而不是日期,目前范围为1-8。

我面临的问题是,在[Report_Submissions]表中,它只包含实际提交报告的组织,而 [Organisation_Reference]表列出了应提交的所有组织。

如果组织提交了报告,那么数据是完美的,并且让我了解每个月所需的所有细节。

显然,如果一个组织没有提交,那么这个细节就不可用了,但是我确实需要有一个完整的列表,列出每个月的参考表中列出的所有组织以及他们是否已提交报告与否。

在提交的时刻' field =' No'它只为每个从未提交过的组织带回一条记录(将Activity_month作为null),如果一个组织只提交了一次或两次,那么它将包括那些提交但仍然缺少剩下的几个月从结果集中。

我已经尝试了各种不同的联接等,但我似乎在为解决方案画一个空白。有没有办法在脚本中生成这些信息?任何建议都会很棒!

亲切的问候,

标记

1 个答案:

答案 0 :(得分:0)

由于您只需要数字1-8,因此使用加入cross apply(values ())到您的Organisation_Reference表的子查询效果很好,并且不会使查询更易于阅读。

select
    a.Organisation_Name
  , a.Org_Id
  , a.Activity_Month
  , sum(b.Activity_Plan) 'Plan_Activity'
  , sum(b.Activity_Actual) 'Actual_Activity'
  , sum(b.Price_Actual) 'Actual_Price'
  , sum(b.Price_Plan) 'Plan_Price'
  , count(b.Instances) as 'record_count'
  , case when count(b.Instances) > 0 then 'yes' else 'no' end as Submitted
from (
  select o.*, t.Activity_Month
  from [ExampleDatabase].[dbo].[Organisation_Reference] as o
    cross apply (values (1),(2),(3),(4),(5),(6),(7),(8)) t(Activity_Month)
  ) as a
  left join [ExampleDatabase].[dbo].[Report_Submissions] b
    on a.Org_Id = b.Org_Id
   and a.Activity_Month = b.Activity_Month
   and ([exmaple_Code] like ('X') or [Example_Code] = 'X')
where a.Category_Flag = 1
  and a.Example_Code in ('X','X','X','X','X') 
group by
  a.Organisation_Name
, a.Org_Id
, b.Activity_Month

您还可以cross join使用数字/计数表,或使用common table expression生成所需的数字范围。我也会推荐其中任何一个选项,特别是如果你的逻辑更加复杂。

如果Report_Submissions包含您在查询中所需的所有月份,则可以cross join从该表格distinct Activity_Months到您的Organisation_Reference表格。

select
    a.Organisation_Name
  , a.Org_Id
  , a.Activity_Month
  , sum(b.Activity_Plan) 'Plan_Activity'
  , sum(b.Activity_Actual) 'Actual_Activity'
  , sum(b.Price_Actual) 'Actual_Price'
  , sum(b.Price_Plan) 'Plan_Price'
  , count(b.Instances) as 'record_count'
  , case when count(b.Instances) > 0 then 'yes' else 'no' end as Submitted
from (
  select o.*, t.Activity_Month
  from [ExampleDatabase].[dbo].[Organisation_Reference] as o
    cross join (select distinct Activity_Month from Report_Submissions) t
  ) as a
  left join [ExampleDatabase].[dbo].[Report_Submissions] b
    on a.Org_Id = b.Org_Id
   and a.Activity_Month = b.Activity_Month
   and ([exmaple_Code] like ('X') or [Example_Code] = 'X')
where a.Category_Flag = 1
  and a.Example_Code in ('X','X','X','X','X') 
group by
  a.Organisation_Name
, a.Org_Id
, b.Activity_Month