SSRS将列转换为按另一列分组的逗号描述列表

时间:2017-05-03 09:22:45

标签: sql-server reporting-services

我有来自SQL查询的数据,看起来像左边的表,但我想使用SSRS使它看起来像右边的表。这可能吗?

output

如果需要,我愿意修改SQL,假设它目前的格式为

SELECT

Name
,Capital Visited

From 

Trips

2 个答案:

答案 0 :(得分:1)

您可以将CROSS APPLYXML PATH功能结合使用,如下所示。

它看起来有点冗长,但它包含与您的样本匹配的样本数据,因此您可以在将其应用到真实表格之前对其进行测试。

DECLARE @trips TABLE([Name] varchar(50), [Capital Visited] varchar(50))
INSERT INTO @trips
VALUES
('Joe', 'London'),
('Fred', 'Tokyo'),
('Joe', 'Berlin'),
('Bob', 'Paris'),
('Fred', 'London'),
('Fred', 'Madrid'),
('Bob', 'Rome')

/* Uncomment below to check the table data looks as expected */
-- SELECT [Name] ,[Capital Visited] From @trips

SELECT DISTINCT
    [Name], cx.Captials
    FROM
        @trips t
        CROSS APPLY (   SELECT Stuff(
                        (
                        SELECT ', ' + [Capital Visited]
                        FROM @trips WHERE [Name] = t.[Name]
                        FOR XML PATH('')
                        ), 1, 2, '') AS Captials
                    ) cx

这为您提供了以下结果

Name        Captials
Bob         Paris, Rome
Fred        Tokyo, London, Madrid
Joe         London, Berlin

而不是我完整地解释答案,这里有一个合理的解释。

How Stuff and 'For Xml Path' work in Sql Server

答案 1 :(得分:1)

作为SSRS解决方案,您可以组合Join和LookupSet 来连接组中的所有值。在按NAME分组的表格中,使用以下表达式:

=Join(LookupSet(Fields!NAME.Value, Fields!NAME.Value, Fields!CAPITAL_VISITED.Value, "DataSet1"), ", ")

LookupSet()从基于主键的数据集中获取所有值,并将它们作为数组返回。 (它通常用于从不同的数据集中获取值,但在这种情况下,我们只使用一个)。 Join()然后使用选定的分隔符(“,”)连接发现数组的所有值。