我有一个表/数据集,如:
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.
答案 0 :(得分:0)
不使用SQL生成CSV,然后尝试使用矩阵控件将行更改为日期/培训中的列和组...但是您之间不会有逗号。
答案 1 :(得分:0)
(我随意标记了您的三列Date
,Session
和Participant
以及您的表MyTable
)
我认为您不能仅仅在报表设计器中执行此操作。我认为最好的方法是编写一个标量值函数,它将datetime
和varchar
(或两个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