具有动态行的SSRS 2005水平矩阵

时间:2013-06-05 15:00:27

标签: reporting-services reportingservices-2005

我有一个关于SSRS,Matrix控件和生成动态行的问题。

我目前有一个数据集,它提供按周分类的值列表:

 Week | Value1| Value2 | Value3
 W1   | 1     | 2      | 3
 W2   | 4     | 5      | 6 

我使用矩阵控件对报告进行逐周细分显示?行标题是静态的,但列标题是从数据集中动态添加的:

         | W1    | W2
 Value1  | 1     | 4
 Value2  | 2     | 5
 Value3  | 3     | 6

这部分很好但是我现在需要添加另一个维度,因为最终报告需要通过几个变量进行拆分。新数据集将是这样的

 Week | VariableA | VariableB | Value1| Value2 | Value3
 W1   | ResultA   | Result1   | 1     | 1      | 1 
 W1   | ResultB   | Result1   | 0     | 1      | 1 
 W1   | ResultA   | Result2   | 0     | 0      | 1 
 W2   | ResultA   | Result1   | 1     | 2      | 5 
 W2   | ResultA   | Result2   | 3     | 3      | 1 

我需要生成一个类似的报告:

                | W1    | W2
 Value1 ResultA | 1     | 4
 Value1 ResultB | 0     | 0
 Value1 Result1 | 1     | 1
 Value1 Result2 | 0     | 3

是否可以以这种方式生成动态行,同时我还生成动态列?我不知道变量的值是什么。

如果您需要更多信息,请提前致谢并发表评论。

1 个答案:

答案 0 :(得分:1)

您可以通过应用UNPIVOT和PIVOT函数使用SQL获取结果。 UNPIVOT将应用两次,第一次将value1value2的多列转换为行,然后第二次实现将variablea / variableb列转换为行。

基本语法为:

select week, 
  col + ' ' + varcol1, value
from table1
unpivot
(
  value
  for col in (value1, value2, value3)
) u
unpivot
(
  var
  for c in (variablea, variableb)
) u1;

SQL Fiddle with Demo。这给出了类似于:

的结果
| WEEK |           COL1 | VALUE |
---------------------------------
|   W1 | Value1 ResultA |     1 |
|   W1 | Value1 Result1 |     1 |
|   W1 | Value2 ResultA |     1 |
|   W1 | Value2 Result1 |     1 |
|   W1 | Value3 ResultA |     1 |
|   W1 | Value3 Result1 |     1 |
|   W1 | Value1 ResultB |     0 |

然后,您可以应用PIVOT函数将W1W2值转换为列:

select col1, W1, W2
from
(
  select week, 
    col + ' ' + var col1, value
  from table1
  unpivot
  (
    value
    for col in (value1, value2, value3)
  ) u
  unpivot
  (
    var
    for c in (variablea, variableb)
  ) u1
) d
pivot
(
  sum(value)
  for week in (W1, W2)
) p;

SQL Fiddle with Demo。这会将数据转换为结果:

|           COL1 | W1 |     W2 |
--------------------------------
| Value1 Result1 |  1 |      1 |
| Value1 Result2 |  0 |      3 |
| Value1 ResultA |  1 |      4 |
| Value1 ResultB |  0 | (null) |
| Value2 Result1 |  2 |      2 |
| Value2 Result2 |  0 |      3 |
| Value2 ResultA |  1 |      5 |
| Value2 ResultB |  1 | (null) |
| Value3 Result1 |  2 |      5 |
| Value3 Result2 |  1 |      1 |
| Value3 ResultA |  2 |      6 |
| Value3 ResultB |  1 | (null) |

这可以转换为动态SQL,需要将其放在存储过程中。