2017-01-05 60 views
1

第一个问题在这里,所以请原谅任何错误......运行3层T-SQL查询报告

我想写一个SQL查询的SSRS报告,我完全糊涂了,当涉及到我的连接。

背景:我有3个表是相关

  • 出版商 - 这本质上是人的名单
  • 发布报告 - 这是一个记录列表(与出版商表)详细介绍了他们在一个月内完成的工作。
  • 投诉月份 - 这是与特定月份和年份相关的记录列表(与发布商报告表格有关)。在这些记录中,他们有一个指标,显示它们是否与前六个月期间相关。

我想要做的是获取未提交与过去6个月内的报告月记录相关的发布商报告的发布商列表。我期望的输出是列出的发布者列表,其中列出了他们在下一列中缺失的报告月份。

我真的很挣扎该怎么办呢?我原以为它看作是一个三个步骤的过程......

--step 1 - 获取的包括在过去6个月中报告清单月

WITH ACTIVE6MREPM AS 
(
SELECT   r.jajw_name, 
       r.jajw_CalendarDate 
FROM   jajw_reportmonthBase r 
WHERE   r.jajw_IncludedIn6MonthReport = '1' 
), 

--STEP 2 - Get list of all publishers 
ACTIVEPUBS AS 
(
SELECT   c.FullName, 
       c.ContactId 
FROM   ContactBase c 
WHERE   c.statecode = '0' 
AND    c.jajw_CongregationAssignment != 640840001 
AND    c.jajw_CongregationAssignment != 640840006 
AND    c.jajw_CongregationAssignment != 640840005 
--AND    q.jajw_FieldServiceGroups = (@Field_Service_Group) 
), 

--STEP 3 - Get List of Publisher Reports for the selected Report Months 
RELEVANTREPORTS AS 
(
SELECT   r.jajw_reportId AS Publisher_Report_GUID, 
       r.jajw_PublisherId AS Publisher_GUID, 
       r.jajw_ReportMonthId AS ReportMonth_GUID, 
       m.jajw_name AS ReportMonth_Name 
FROM   jajw_reportBase r 
INNER JOIN  jajw_reportmonthBase m ON r.jajw_ReportMonthId = m.jajw_reportmonthId 
WHERE   r.jajw_ReportPeriod6Month = '1' 
ORDER BY  m.jajw_CalendarDate 

这三个之后,我想创建我的列表,如上所述,这是我难倒了!任何帮助将不胜感激!

谢谢!

+0

表是如何关联的? ID字段在哪里?也许如果你为这三个表格中的每一个提供一些数据可能会更好。查询本身不应该很复杂,但您的CTE令我困惑。 – Anand

+0

为什么CTE将@anand和 – scsimon

+1

@scsimon混淆,而不是一般的CTE,哈哈。这些特定的CTE不能帮助理解表格之间的关系。 – Anand

回答

0

我认为你可以缩短你的代码很多......这里有一个镜头,它没有测试数据......一定要阅读注释并添加连接条件并检查where子句。

with cte as(
SELECT   r.jajw_reportId AS Publisher_Report_GUID, 
       r.jajw_PublisherId AS Publisher_GUID, 
       r.jajw_ReportMonthId AS ReportMonth_GUID, 
       m.jajw_name AS ReportMonth_Name, 
       c.FullName, 
       c.ContactId 
FROM   jajw_reportBase r 
INNER JOIN  jajw_reportmonthBase m ON 
       r.jajw_ReportMonthId = m.jajw_reportmonthId 
INNER JOIN  ContactBase c on       --what ever condition is appropiate 
WHERE   r.jajw_ReportPeriod6Month = '1' 
       and m.jajw_IncludedIn6MonthReport = '1' --maybe put this here, or does the above do the same thing? 
ORDER BY  m.jajw_CalendarDate) 

select 
    p2.FullName, 
    p2.ReportMonth_Name 
from cte p 
right join(select distinct 
       ReportMonth_Name, FullName 
      from ContactBase 
      left join jajw_reportmonthBase on 1=1) p2 on p2.FullName = p.FullName and p2.ReportMonth_Name = p.ReportMonth_Name 
where 
    ContactId in (select ContactId from cte group by ContactId having count(distinct ReportMonth_GUID) < 6) 
    and p.FullName is null 

这里是一个使用测试数据的例子。

declare @pub table (pubname varchar(56), ReportMonthName varchar(16)) 
insert into @pub (pubname,ReportMonthName) values 
('a','Jan'), 
('a','Feb'), 
('a','Mar'), 
('a','Apr'), 
--publisher a is missing May and Jun 
('b','Jan'), 
('b','Feb'), 
('b','Mar'), 
('b','Jun') 
--publisher b is missing Apr and May 

declare @dt table (ReportMonthName varchar(16)) 
insert into @dt (ReportMonthName) values 
('Jan'), 
('Feb'), 
('Mar'), 
('Apr'), 
('May'), 
('Jun') 



select 
    p2.pubname 
    ,p2.ReportMonthName 
from @pub p 
right join(
select distinct 
    p.pubname 
    ,d.ReportMonthName 
from @pub p 
left join @dt d on 1=1)p2 on p2.pubname = p.pubname and p2.ReportMonthName = p.ReportMonthName where p.pubname is null 
+0

嗨@scsimon非常感谢您的帮助!唯一的麻烦是,这给了我缺少报告的发布者(这是我想要的),但它显示了他们提交报告的报告月份。我想要一份报告缺失的发布者列表,以及缺少哪些报告。那有意义吗? –

+0

@JoelAbbott我编辑了答案,希望能解决这个问题。没有你的数据很难做到。我提供了一些测试数据,以便在需要调整时可以看到逻辑。 – scsimon

+0

@JoelAbbott是否做到了这一点? – scsimon