2017-09-14 16 views
0

我的查詢結果是pivoted表,顯示從當前月份開始的12個月和總金額。幾個月是動態的,所以在十月份,表中的第一列將是十一月,最後一列將是十月(當前一列)。可以通過動態旋轉表在SSRS中製作Tablix報告嗎?

enter image description here

我如何可以創建簡單的表矩陣或使用該結果矩陣集?我主要關心的是如何在Tablix中創建動態的月份名稱?

這可能嗎?

enter image description here UPDATE:

我重命名的列值從1到12,但是,當我嘗試寫來回十月像一個表達式:=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 -moount-only – Oleg

+0

@Oleg - 你根本不需要動態sql。我會在幾分鐘內更新我的答案並提供更好的解釋... –

+0

@Oleg - 您正在使用哪種版本的SQL Server? –