1

次のようなテーブル/データセットがあります。

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

アイデアは、ページの大部分に 1 列を下に印刷することによって、結果として印刷されるページ スペースが無駄にならないようにすることですが、スペースをそのフィールド内の水平方向のリストまたは列化された結果のいずれかに短縮するというものです。最善の方法は何ですか?

SQLの結果をいじるのではなく、レポートデザイナーでこれを処理したいと思います。近づく方法はいくつかありますが、正確ではありません。私はSSRS 2005を使用しています。

4

5 に答える 5

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" 
   )
于 2009-06-10T19:47:47.147 に答える
0

t-sql の select 部分で SQL stuff/xml ステートメントを使用し、select のデータ全体に結合して終了しました。このようなもの: http://www.kodyaz.com/articles/concatenate-using-xml-path.aspx

于 2009-09-29T17:11:35.370 に答える
0

(私はあなたの 3 つの列DateSession、およびParticipant、およびあなたのテーブルに勝手にラベルを付けていますMyTable)

レポート デザイナーだけでこれを行うことはできないと思います。datetime私が考える最良の方法は、aと a varchar(または 2 つvarcharの s) を 2 つの入力として取り、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、でそれを行います

SELECT Date, Session, dbo.MyFunction(Date, Session) As Participants GROUP BY Date, Session
于 2009-05-20T20:54:12.330 に答える
0

SQLを使用してCSVを生成せずに、マトリックスコントロールを試して、日付/トレーニングで行を列とグループに変更してください...しかし、間にコンマはありません.

于 2009-04-17T20:04:41.127 に答える
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 句を使用することが絶対的な規則です。

お役に立てれば。

于 2009-06-10T16:46:30.367 に答える