2011-10-31 13 views
1

SSRSレポートプロジェクトでは、過去12ヶ月間の施設の検査結果の傾向に関するデータが必要です。 'InspectionDate'などの固定フィールドでグループ化できる標準のBIレポートアプリケーションとは異なり、すべての検査の結果は 'StartDate'と 'EndDate'の間で有効です。新しい検査が実行されると、その施設の以前のレコードは終了日を取得し、新しい開始日と終了日がNULLの新しいレコードが作成されます。毎月の状況を集約したデータを報告する必要があります。EventDateではなくStartDateとEndDateのみを指定した月の日付数に関するレポート

次のように

だから、現在、私はこれのためのデータを生成するために取っているアプローチがある: -

1)レポートサーバーへのライブデータを複製し、レコードだった数ヶ月フラグにP11に12個の新しいフィールドP0を追加過去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毎月のために私に点検を1行を与えるために、テーブルが

4有効であった)の再 - PIVOT結果は集計されたカウントと毎月の平均のスコアを与えるために

だから - これは少しclunkyですが動作します。 これを行うためのより優雅で効率的な方法はありますか?

感謝

答えて

2

私は目的のカップルでこれをクリーンアップします:

  • 実行するすべてのデータを返すために一つだけのクエリ。

  • すべてのデータを1つの長いテーブルで返します。月単位でピボットされません。 SSRSにピボットをさせます。

I.E.クエリから 結果:私はのための月の開始日と終了日とのCTEを作成

; 
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 

まず:

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 

は、以下のクエリはあなたに物事のクエリ側のためのまともな枠組みを与える必要があります過去1年間次に私はそれを検査テーブルに参加させますが、結合の条件では、適切な不等式演算子を使用して、1つの検査行を月テーブルの複数の行に結合します。

次に、SSRSでは、表ではなく行列データ要素を使用する必要があります。列グループはMonth Start、行グループ= InspectionID、SUM(ThingBeingMeasured)をセルに配置します。

+0

上記を調べてCTEを読み上げた後、この例は完全に機能し、自分の試みよりもはるかにプロフェッショナルに見えます。ありがとう –

関連する問題