2011-10-31 38 views
1

在SSRS報表項目,每個月的罪名,我需要在機構的檢查的結果趨勢在過去12個月(滾動)的數據。 不像一個標準的BI報表應用程序,其中分組可以在一個固定的字段來完成,例如「InspectionDate」,每次檢查的結果是「起始日期」和「結束日期」之間有效。當執行新的檢查時,該機構的上一條記錄會得到一個結束日期,並會創建一條新記錄,其中新的開始日期和結束日期爲null。我需要彙總每個月的狀態彙總數據。報告的日期只給出起始日期日期和結束日期,而不是EVENTDATE

所以目前,我正在製作此數據的方法如下: -

1)複製實時數據報告服務器,並添加12個新領域P0至P11來標誌該月的記錄是在過去12個月內有效。以下表格

2)運行12更新查詢...

UPDATE tblDistributionReports 
SET P1 = 1 
WHERE DATEDIFF(MONTH,GETDATE(),StartDate) <= -1 
AND (ENDDATE IS NULL OR DATEDIFF(MONTH,GETDATE(),EndDate) >= -1) 
Etc ..... 

3)UNPIVOT表給我一個行每個月檢查是有效的

4)重新 - PIVOT結果給我彙總數和分數的平均每月

所以 - 這工作雖然是有點麻煩。 有沒有更優雅和有效的方式做到這一點,我還沒有?

非常感謝

回答

2

我將與一對夫婦的目標打掃一下:

  • 只運行一個查詢返回的所有數據。

  • 返回所有在一個長表中的數據,而不是幾個月擺動。讓SSRS做旋轉。

I.E. 結果從查詢:

MonthStart  MonthEnd   InspectionID ThingBeingMeasured 
Jan 1, 2011 Feb 1, 2011  1    14 
Feb 1, 2011 March 1, 2011 1    14 
March 1, 2011 April 1, 2011 1    14 
March 1, 2011 April 1, 2011 2    9 
April 1, 2011 May 1, 2011  2    9 

下面的查詢應該給你的東西查詢側一個體面的框架:

; 
WITH MonthsCTE AS (
SELECT 
    DATEADD(
     year, 
     -1, 
     DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0)) 
    as MonthStart, 
    DATEADD(
     year, 
     -1, 
     DATEADD(month, DATEDIFF(month, 0, GETDATE()) +1, 0)) 
    as MonthEnd 
UNION ALL 
SELECT 
    DATEADD(Month, 1, MonthStart), 
    DATEADD(MONTH, 1, MonthEnd) 
FROM 
    MonthsCTE 
WHERE MonthEnd < GETDATE()) 

SELECT 
    MonthsCTE.MonthStart, 
    MonthsCTE.MonthEnd, 
    InspectionID, 
    SUM(NumberOfViolations) AS SumOfViolations 
FROM Inspections 
INNER JOIN 
    MonthsCTE 
ON COALESCE(Inspections.EndDate, GETDATE()) >= MonthsCTE.MonthStart 
    AND Inspections.StartDate < MonthsCTE.MonthEnd 
GROUP BY 
    MonthsCTE.MonthStart, 
    MonthsCTE.MonthEnd, 
    InspectionID 

首先我創建了一個CTE與月份開始日期和結束日期爲去年。然後我將它加入到檢查表中,但在加入條件下,我使用適當的不平等運算符將一個檢查行連接到月表中的多行。

然後,在SSRS,你應該使用一個矩陣的數據元素,而不是一個表。列組將爲Month Start,行組= InspectionID,並將SUM(ThingBeingMeasured)放入單元格中。

+0

上面的檢查和CTE readiing起來後,例如完美的作品,看起來比我自己嘗試更加專業。謝謝 –

相關問題