如何在SSRS报告中将SQL值从一列传递到多列?

时间:2016-05-31 05:38:07

标签: sql sql-server tsql reporting-services ssrs-2008

所以我有一个存储过程,它返回以下数据:

GroupId   FieldName    Value         
1         Foo          28
1         Bar          2
1         FooBar       11
1         Bizz         22
1         UserName     John Smith
2         Foo          4
2         Bar          13
2         FooBar       27
2         Bizz         23
2         UserName     Peter Jones
3         Foo          5
3         Bar          4
3         FooBar       12
3         Bizz         18
3         UserName     Lisa Johnson
...........

正如您在上面的示例数据中看到的,共有3个组( 12& 3 for real有10个基))。每个组在FieldName列中都有相同的字段名称(它类似于标题),而在Value列中则存储了值。

我需要在以下内容中创建SSRS报告:

Foo          28              4                5
Bar          2               13               4
FooBar       11              27               12
Bizz         22              23               18
UserName     John Smith      Peter Jones      Lisa Johnson

如上所示,每个组应位于左侧(第1列)的不同列和标题中。

在第一栏中,我通过了FieldName;

在第二栏中,我通过了表达式:=IIF(Fields!GroupId.Value = 1, Fields!Value.Value, "")

在第3栏中,我传递了表达式:=IIF(Fields!GroupId.Value = 2, Fields!Value.Value, "")

在第4栏中,我通过了表达式:=IIF(Fields!GroupId.Value = 3, Fields!Value.Value, "")

但我实现了这样的输出:

Foo          28                   
Bar          2                    
FooBar       11                   
Bizz         22                   
UserName     John Smith           
Foo                        4          
Bar                        13           
FooBar                     27           
Bizz                       23           
UserName                   Peter Jones
Foo                                      5
Bar                                      4
FooBar                                   12
Bizz                                     18
UserName                                 Lisa Johnson

你有什么想法,有什么不对吗?我应该尝试与群组做些什么吗?我试过但也没成功。如果事情不清楚 - 问我,我会尝试提供更多细节。

3 个答案:

答案 0 :(得分:2)

如果字段名称对您不重要,那么您可以使用带有fieldgroup行组和groupid列组的矩阵在SSRS中执行此操作。如果您不想要标题,请通过更改文本框可见性选项隐藏它们。

答案 1 :(得分:0)

您可以通过SQL Server中的 pivoting 来实现此输出。

首先,我使用您的输入数据创建temptable

CREATE TABLE #temptable (
    GroupId int, 
    FieldName nvarchar(max), 
    [Value] nvarchar(max)
)
INSERT INTO #temptable VALUES       
(1,         'Foo',          '28'),
(1,         'Bar',          '2'),
(1,         'FooBar',       '11'),
(1,         'Bizz',         '22'),
(1,         'UserName',     'John Smith'),
(2,         'Foo',          '4'),
(2,         'Bar',          '13'),
(2,         'FooBar',       '27'),
(2,         'Bizz',         '23'),
(2,         'UserName',     'Peter Jones'),
(3,         'Foo',          '5'),
(3,         'Bar',          '4'),
(3,         'FooBar',       '12'),
(3,         'Bizz',         '18'),
(3,         'UserName',     'Lisa Johnson')

然后我使用动态SQL,因为我们不知道有多少GroupID

DECLARE @columns nvarchar(max), @sql nvarchar(max)
--Here we create a string like '[1],[2],[3]' named by GroupID's 
--because if there are many groupid's - manually assign columns for pivot 
--will be a long process
SELECT @columns = STUFF((SELECT DISTINCT ','+QUOTENAME(GroupId) FROM #temptable FOR XML PATH('')),1,1,'')

--Create sql statement to execute
SELECT @sql = '
SELECT *
FROM (
SELECT *
FROM #temptable
) as p
PIVOT(
MAX([Value]) FOR GroupId IN ('+@columns+')
) as pvt'
--And execute!
EXEC(@sql)

输出:

FieldName   1           2           3
Bar         2           13          4
Bizz        22          23          18
Foo         28          4           5
FooBar      11          27          12
UserName    John Smith  Peter Jones Lisa Johnson

答案 2 :(得分:0)

使用以下SQL逻辑&在报告级别转动数据......

;WITH CTE AS (       
SELECT 1 GroupId ,'Foo' FieldName,'28' Value
 UNION ALL       
SELECT 1         ,'Bar'          ,'2'
 UNION ALL       
SELECT 1         ,'FooBar'       ,'11'
 UNION ALL       
SELECT 1         ,'Bizz'         ,'22'
 UNION ALL       
SELECT 1         ,'UserName'     ,'John Smith'
 UNION ALL       
SELECT 2         ,'Foo'          ,'4'
 UNION ALL       
SELECT 2         ,'Bar'          ,'13'
 UNION ALL       
SELECT 2         ,'FooBar'       ,'27'
 UNION ALL       
SELECT 2         ,'Bizz'         ,'23'
 UNION ALL       
SELECT 2         ,'UserName'     ,'Peter Jones'
 UNION ALL       
SELECT 3         ,'Foo'          ,'5'
 UNION ALL       
SELECT 3         ,'Bar'          ,'4'
 UNION ALL       
SELECT 3         ,'FooBar'       ,'12'
 UNION ALL       
SELECT 3         ,'Bizz'         ,'18'
 UNION ALL       
SELECT 3         ,'UserName'     ,'Lisa Johnson'
)

SELECT FieldName, CTE.Value
FROM CTE 
CROSS APPLY ( SELECT CTE.Value )A
ORDER BY FieldName