我有一个关于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
是否可以以这种方式生成动态行,同时我还生成动态列?我不知道变量的值是什么。
如果您需要更多信息,请提前致谢并发表评论。
答案 0 :(得分:1)
您可以通过应用UNPIVOT和PIVOT函数使用SQL获取结果。 UNPIVOT将应用两次,第一次将value1
,value2
的多列转换为行,然后第二次实现将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函数将W1
和W2
值转换为列:
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,需要将其放在存储过程中。