所以我有一个存储过程,它返回以下数据:
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个组( 1
,2
& 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
你有什么想法,有什么不对吗?我应该尝试与群组做些什么吗?我试过但也没成功。如果事情不清楚 - 问我,我会尝试提供更多细节。
答案 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