SSRS 2005:将列列显示从项目列值/一行更改为其他内容?

时间:2009-04-17 19:59:01

标签: sql-server sql-server-2005 reporting-services csv reportingservices-2005

我有一个表/数据集,如:

1/1/2009 | Training 1 | Mike
1/1/2009 | Training 1 | Bill
1/1/2009 | Training 1 | Steve

我想显示为

1/1/2009 | Training 1 
Mike, Bill, Steve

这个想法是,通过在大部分页面上打印一列但是将空间缩短为该字段内的水平列表或柱状结果,不会浪费所得到的打印页面空间。什么是最好的方式?

我想处理这是报表设计器,而不是使用SQL结果。我看到几种接近但不准确的方法。我参加了SSRS 2005.

5 个答案:

答案 0 :(得分:0)

不使用SQL生成CSV,然后尝试使用矩阵控件将行更改为日期/培训中的列和组...但是您之间不会有逗号。

答案 1 :(得分:0)

(我随意标记了您的三列DateSessionParticipant以及您的表MyTable

我认为您不能仅仅在报表设计器中执行此操作。我认为最好的方法是编写一个标量值函数,它将datetimevarchar(或两个varchar s)作为两个输入并生成{{1输出。该函数看起来像这样:

varchar

然后,当您从Declare @Names varchar(MAX), @Participant varchar(MAX) Set @Names = '' Declare NameCursor Insensitive cursor For SELECT Participant FROM MyTable WHERE Date = @Date AND Session = @Session Open NameCursor Fetch Next From NameCursor Into @Participant While @@FETCH_STATUS=0 Begin Select @Names = @Names + ', ' + @Participant Fetch Next From NameCursor Into @Participant End Close NameCursor Deallocate NameCursor Return SUBSTRING(@Names, 3, LEN(@Names)) 中选择时,请使用

进行操作
MyTable

答案 2 :(得分:0)

我编写了以下查询来使用公共表表达式构建基本数据集,然后使用分组/连接操作来获取我认为您正在寻找的结果:

    WITH temp AS (
    SELECT CAST('1/1/2009' AS DATETIME) AS Date, 'Training 1' AS Session, 'Mike' AS Participant
    UNION ALL
    SELECT CAST('1/1/2009' AS DATETIME) AS Date, 'Training 1' AS Session, 'Bill' AS Participant
    UNION ALL
    SELECT CAST('1/1/2009' AS DATETIME) AS Date, 'Training 1' AS Session, 'Steve' AS Participant
    UNION ALL
    SELECT CAST('1/2/2009' AS DATETIME) AS Date, 'Training 2' AS Session, 'Steve' AS Participant
    UNION ALL
    SELECT CAST('1/2/2009' AS DATETIME) AS Date, 'Training 2' AS Session, 'Bill' AS Participant
    UNION ALL
    SELECT CAST('1/3/2009' AS DATETIME) AS Date, 'Training 3' AS Session, 'Mike' AS Participant
)
SELECT DISTINCT
    Date,
    Session,
    (
        SELECT STUFF(
            (
                SELECT
                    ',' + CAST(Participant AS NVARCHAR(50)) + '' AS [text()]
                FROM
                    temp b
                WHERE
                    b.Date = a.Date AND
                    b.Session = a.Session
                FOR  
                    XML PATH('')
            ),
            1,
            1,
            ''
        )
    ) AS Participants
FROM
    temp a

这输出以下内容:

Date    Session Participants
2009-01-01 00:00:00.000 Training 1  Mike,Bill,Steve
2009-01-02 00:00:00.000 Training 2  Steve,Bill
2009-01-03 00:00:00.000 Training 3  Mike

您可以根据需要在SSRS中格式化这些结果。没有承诺,由于DISTINCT子句,这将在非常大的数据集上快速运行,但是无论如何,您对大型数据集执行的任何分组操作都会很慢。在连接时,使用像这样的FOR XML子句绝对是规则。

希望这有帮助。

答案 3 :(得分:0)

在SSRS中进行聚合连接的常用方法是使用自定义代码。请看这里的例子:

http://blogs.msdn.com/suryaj/archive/2007/08/11/string-aggregation.aspx

以下是基本形式的自定义代码:

Private CurrGroupBy As String = String.Empty
Private ConcatVal As String = String.Empty
Public Function AggConcat(GroupBy as String, ElementVal as String) as String
    If CurrGroupBy = GroupBy Then
        ConcatVal = ConcatVal & ", " & ElementVal 
    Else
        CurrGroupBy = GroupBy 
        ConcatVal = ElementVal 
    End If
    Return ConcatVal 
End Function

在您想要显示的分组级别执行此操作:

=RunningValue(
     Code.AggConcat(
         Fields!YourFieldToGroupBy.Value
       , Fields!YourFieldToConcat.Value
       )
   , Last
   , "YourGroupName" 
   )

答案 4 :(得分:0)

我在t-sql的select部分使用SQL stuff / xml语句结束,并返回整个select的数据。这样的事情:http://www.kodyaz.com/articles/concatenate-using-xml-path.aspx