2017-01-05 120 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