2011-11-23 198 views
0

经过与BIDS努力完成此操作后,我的问题在这里:ssrs固定矩阵宽度

在SSRS 2008年,我在选定的月份使用列组的矩阵。第一列是第一个选择的一个月,十二个月的新表开始后:

Month | Mar11 May11 Apr11 Jun11 Jul11 Aug11 Sep11 Oct11 Nov11 Dec11 Jan12 Feb12 
------+------------------------------------------------------------------------ 
Cat.1 | 3  4  5 7  8  9  1  3 
Cat.2 | 4  2  3 6  1  3  2  5 

Month | Mar12 May12 Apr12 
------+------------------------------------------------------------------------ 
Cat.1 | 3  2  1 
Cat.2 | 4  1  7 

这给出了一个整齐的桌子,而当“重复”表的(模拟了大排组),表整齐地显示在整个宽度上。但是,选择仅一个月的时候,布局过于狭窄,看起来相当跛:

Month | Mar 
------+---- 
Cat.1 | 3 

如何创建一个矩阵,具有固定宽度(即,12列的宽度),无论多少个月被选中?

回答

0

有两种方法可以做到这一点:

做一个直角框架,在查询中使用不同的行和列分组值。

SELECT 
C.MonthStarting 
,R.Category 
,D.InstanceCount 

FROM (-- column values 
    SELECT DISTINCT MonthStarting 
    FROM Calendar 
    WHERE MonthStarting BETWEEN @StartDate AND @EndDate 
) AS AS C 

JOIN (-- row values 
    SELECT DISTINCT Category 
    FROM SomeRelevantTables 
) AS R 
    ON 1 = 1 -- intentional cartesian product 

LEFT JOIN (
    SELECT 
    Category 
    ,MonthStarting 
    ,COUNT(1) AS InstanceCount 

    FROM SomeRelevantTables 

    GROUP BY 
     Category 
     ,MonthStarting 
) AS D 
    ON C.MonthStarting = D.MonthStarting 
    AND R.Category = D.Category 

或者你可以转动的查询,而不是布局列在表中,而不是一个矩阵显示数据。

SELECT 
T.Category 
,SUM(CASE WHEN C.RowNumberAsc = 1 THEN 1 END) AS Column1 
,SUM(CASE WHEN C.RowNumberAsc = 2 THEN 1 END) AS Column2 
,SUM(CASE WHEN C.RowNumberAsc = 3 THEN 1 END) AS Column3 
,SUM(CASE WHEN C.RowNumberAsc = 4 THEN 1 END) AS Column4 

FROM SomeRelevantTables AS T 

JOIN (
    SELECT 
    C.* 
    ,ROW_NUMBER()OVER(PARTITION BY MonthStarting) AS RowNumberAsc 

    FROM (
     SELECT DISTINCT MonthStarting 
     FROM Calendar 
     WHERE MonthStarting BETWEEN @StartDate AND @EndDate 
    ) AS C 
) AS C 
    ON T.MonthStarting = C.MonthStarting 

GROUP BY 
    T.Category