2017-09-14 20 views
0

私のクエリの結果は、現在の月と合計金額から12ヶ月前に表示されるピボットテーブルです。月は動的なので、10月には表の最初の列が11月になり、最後の列は10月(現在の列)になります。動的にピボットテーブルからSSRSでTablixレポートを作成できますか?

enter image description here

どのように私は、この結果セットを使用して、簡単なTablixのか、行列を作成することができますか?私の主な関心事は、タブリックスで動的な月の名前を作る方法です。

これは可能ですか?

enter image description here UPDATE:

Iは1から12までの値として、列の名前を変更しかし、私は次のように10月あちこちに式を記述しようとすると:=Month(Today()) - CInt(Fields!ID10.Value)そのはちょうど私の現在の月の番号を与えます。 私は何が欠けていますか?

enter image description here

UPDATE:このような構造の表のカレンダーで データ:

enter image description here

だから私は、クエリを変更:

DECLARE @CurrentMonth DATE = DATEADD(MONTH, DATEDIFF(MONTH, '19000101', GETDATE()), '19000101'); 
--print @CurrentMonth 

SELECT 
    M_00 = COUNT(CASE WHEN DATEDIFF(MONTH, fom.FirstOfMonth, @CurrentMonth) = 0 THEN 1 END), 
    M_01 = COUNT(CASE WHEN DATEDIFF(MONTH, fom.FirstOfMonth, @CurrentMonth) = 1 THEN 1 END), 
    M_02 = COUNT(CASE WHEN DATEDIFF(MONTH, fom.FirstOfMonth, @CurrentMonth) = 2 THEN 1 END), 
    M_03 = COUNT(CASE WHEN DATEDIFF(MONTH, fom.FirstOfMonth, @CurrentMonth) = 3 THEN 1 END), 
    M_04 = COUNT(CASE WHEN DATEDIFF(MONTH, fom.FirstOfMonth, @CurrentMonth) = 4 THEN 1 END), 
    M_05 = COUNT(CASE WHEN DATEDIFF(MONTH, fom.FirstOfMonth, @CurrentMonth) = 5 THEN 1 END), 
    M_06 = COUNT(CASE WHEN DATEDIFF(MONTH, fom.FirstOfMonth, @CurrentMonth) = 6 THEN 1 END), 
    M_07 = COUNT(CASE WHEN DATEDIFF(MONTH, fom.FirstOfMonth, @CurrentMonth) = 7 THEN 1 END), 
    M_08 = COUNT(CASE WHEN DATEDIFF(MONTH, fom.FirstOfMonth, @CurrentMonth) = 8 THEN 1 END), 
    M_09 = COUNT(CASE WHEN DATEDIFF(MONTH, fom.FirstOfMonth, @CurrentMonth) = 9 THEN 1 END), 
    M_10 = COUNT(CASE WHEN DATEDIFF(MONTH, fom.FirstOfMonth, @CurrentMonth) = 10 THEN 1 END), 
    M_11 = COUNT(CASE WHEN DATEDIFF(MONTH, fom.FirstOfMonth, @CurrentMonth) = 11 THEN 1 END) 
FROM 
    dbo.tblCalendar c 
     /* changed "YearNum, MonthNum" instead of "(YEAR(c.dt), MONTH(c.dt)" */ 
    CROSS APPLY (VALUES (DATEFROMPARTS(YearNum, MonthNum, 1))) fom (FirstOfMonth) 
WHERE 
    /* changed c.MonthNum instead of c.dt */ 
    c.MonthNum >= MONTH(DATEADD(MONTH, -11, @CurrentMonth)) 
    /* changed c.MonthNum instead of c.dt */ 
    AND c.MonthNum < MONTH(DATEADD(MONTH, 1, @CurrentMonth)); 

は正しいですか?

申し訳ありませんが、ここで私は混乱しています。アイデアは動的SQLをまったく使用しないことですか? はちょうどである私のクエリを使用:

;WITH cte_TopClasses 
AS ( 
SELECT 
     c.YearNum, 
     c.MonthNum, 
     DD.ClassCode, 
     ISNULL(SUM(prm.Premium),0) as NetWrittenPremium 
FROM tblCalendar c 
LEFT JOIN ProductionReportMetrics prm ON c.YearNum = YEAR(prm.EffectiveDate) and c.MonthNum = MONTH(prm.EffectiveDate) 
      AND CompanyGUID = '18E04C99-D796-4CFA-B1E7-28328321C8AD'  
LEFT JOIN [dbo].[Dynamic_Data_GLUnitedSpecialty] DD on prm.QuoteGUID = DD.QuoteGuid 
WHERE (c.YearNum = YEAR(GETDATE())-1 and c.MonthNum >= MONTH(GETDATE())+1) OR 
     (c.YearNum = YEAR(GETDATE()) and c.MonthNum <= MONTH(GETDATE())) 
GROUP BY c.YearNum, 
      c.MonthNum, 
      DD.ClassCode   
    ) 

select * from cte_TopClasses 

OUTPUT:

enter image description here

答えて

1

は、私は、データソース内のテーブル名はスキーマが保存されているような静的である必要が信じています。これで、今月の関数に基づいてSSRSの列に名前を付けることができます。したがって、データセットに列を常に11から0に戻すことができ、SSRSは現行月から列名を引いたものとしてTablix列に動的に名前を付けるようにすることができます。

+0

ありがとうアンドリュー、私はそれをしましたが、まだ混乱しました。私は質問を更新しました。 – Oleg

1

SSRSには固定列の入力列が必要なため、ダイナミックピボットクエリは完全に互換性がありません。 SSRSにデータをピボット解除し、SSRSでマトリックス上でピボットさせます。非動的SQLを使用して

編集... ...

これらの線に沿って何かを行います...

DECLARE @CurrentMonth DATE = DATEADD(MONTH, DATEDIFF(MONTH, '19000101', GETDATE()), '19000101'); 

SELECT 
    M_00 = COUNT(CASE WHEN DATEDIFF(MONTH, fom.FirstOfMonth, @CurrentMonth) = 0 THEN 1 END), 
    M_01 = COUNT(CASE WHEN DATEDIFF(MONTH, fom.FirstOfMonth, @CurrentMonth) = 1 THEN 1 END), 
    M_02 = COUNT(CASE WHEN DATEDIFF(MONTH, fom.FirstOfMonth, @CurrentMonth) = 2 THEN 1 END), 
    M_03 = COUNT(CASE WHEN DATEDIFF(MONTH, fom.FirstOfMonth, @CurrentMonth) = 3 THEN 1 END), 
    M_04 = COUNT(CASE WHEN DATEDIFF(MONTH, fom.FirstOfMonth, @CurrentMonth) = 4 THEN 1 END), 
    M_05 = COUNT(CASE WHEN DATEDIFF(MONTH, fom.FirstOfMonth, @CurrentMonth) = 5 THEN 1 END), 
    M_06 = COUNT(CASE WHEN DATEDIFF(MONTH, fom.FirstOfMonth, @CurrentMonth) = 6 THEN 1 END), 
    M_07 = COUNT(CASE WHEN DATEDIFF(MONTH, fom.FirstOfMonth, @CurrentMonth) = 7 THEN 1 END), 
    M_08 = COUNT(CASE WHEN DATEDIFF(MONTH, fom.FirstOfMonth, @CurrentMonth) = 8 THEN 1 END), 
    M_09 = COUNT(CASE WHEN DATEDIFF(MONTH, fom.FirstOfMonth, @CurrentMonth) = 9 THEN 1 END), 
    M_10 = COUNT(CASE WHEN DATEDIFF(MONTH, fom.FirstOfMonth, @CurrentMonth) = 10 THEN 1 END), 
    M_11 = COUNT(CASE WHEN DATEDIFF(MONTH, fom.FirstOfMonth, @CurrentMonth) = 11 THEN 1 END) 
FROM 
    dbo.Calendar c 
    CROSS APPLY (VALUES (DATEFROMPARTS(YEAR(c.dt), MONTH(c.dt), 1))) fom (FirstOfMonth) 
WHERE 
    c.dt >= DATEADD(MONTH, -11, @CurrentMonth) 
    AND c.dt < DATEADD(MONTH, 1, @CurrentMonth); 

クエリ出力...

M_00  M_01  M_02  M_03  M_04  M_05  M_06  M_07  M_08  M_09  M_10  M_11 
----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- 
30   31   31   30   31   30   31   28   31   31   30   31 

アイデアがあります列のデータは月の経過とともに列を循環しますが、列の名前は常に同じであるため、常にSSRSでうまくいきます。

次に、クエリからヘッダーを表示するのではなく、SSRSに戻り、数式を使用します。何かのように

=MonthName(month(Now())) 
=MonthName(month(Now()) + 1) 
=MonthName(month(Now()) + 2) 
=MonthName(month(Now()) + 3) 
... 
+0

私がそのような回避策を行っている理由は、これのためです:https://stackoverflow.com/questions/46064690/how-to-pivot-table-by-month-and-display-top-10-by-total -amount-only – Oleg

+0

@Oleg - これには動的SQLはまったく必要ありません。私はいくつかの分でより良い説明で私の答えを更新します... –

+0

@Oleg - どのバージョンのSQL Serverを使用していますか? –

関連する問題