2017-09-14 1 views
0

내 쿼리의 결과는 현재 월 및 총 금액에서 12 개월 전에 표시되는 피벗 테이블입니다. 달은 동적이므로 10 월에 표의 첫 번째 열은 11 월이고 마지막 열은 10 월이됩니다 (현재 열).동적 피벗 테이블에서 SSRS의 테이블 릭스 보고서를 만들 수 있습니까?

enter image description here

어떻게 설정 간단한 테이블 릭스 또는이 결과를 이용하여 매트릭스를 만들 수 있습니까? 주요 관심사는 테이블 릭스에서 동적 인 월 이름을 만드는 방법입니다.

그게 가능합니까?

enter image description here UPDATE :

나는 10 월 같은 이리저리 식을 작성하려고 값을 1에서 12 그러나 때와 같이 내가 열 이름을 변경 : =Month(Today()) - CInt(Fields!ID10.Value)의 단지 나에게주는 현재 월 번호. 내가 무엇이 누락 되었습니까?

enter image description here

UPDATE : 테이블 달력에서 데이터는 다음과 같이 구성 :

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)); 

가 올바른지인가요 :

enter image description here

그래서 내가 쿼리를 수정?

죄송합니다. 여기 혼란스러워합니다. 동적 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 

출력 :

enter image description here

답변

1

내가 데이터 소스의 테이블 이름은 스키마가 저장 될 때 정적 일 필요 믿습니다. 그렇게 말하면 현재 달 주변의 함수를 기반으로 SSRS의 열 이름을 지정할 수 있습니다. 따라서 데이터 집합에서 열을 항상 11에서 0으로 반환하고 SSRS에서 테이블 릭스 열의 이름을 현재 월에서 열 이름을 뺀 값으로 동적으로 지정하도록 할 수 있습니다.

+0

감사합니다. Andrew, 저도 그랬지만 여전히 혼란 스러웠습니다. 나는 질문을 업데이트했다. – Oleg

1

SSRS는 고정 된 입력 열 집합이 필요하므로 동적 피벗 쿼리가 완전히 호환되지 않습니다. SSRS에 데이터를 가져 오지 말고 SSRS가 행렬에서 피벗되도록하십시오.

편집 ... 사용 비 동적 SQL ... 아이디어는

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 

이 라인을 따라 뭔가를 수행 ...

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); 

쿼리 출력 ... 열의 데이터가 달 진행으로 열을 순환하지만 열 이름은 항상 동일하게 유지됩니다 ... 그래서 항상 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 버전은 무엇입니까? –