1

Ich habe eine Tabelle/Datensatz wie:SSRS 2005: Ändern Sie die Spaltenanzeige von Artikelspaltenwert/eine Zeile zu etwas anderem?

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

Ich mag würde als

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

angezeigt wird Die Idee ist, dass die resultierende gedruckte Seite Raum nicht durch das Drucken einer Spalte auf den meisten der verschwendeten Seite nach unten, aber den Raum zu einer horizontalen Liste oder einem columned Ergebnis innerhalb dieses Feldes zu kürzen. Was ist der beste Weg?

Ich würde gerne damit umgehen ist Bericht Designer im Gegensatz zu Mist mit SQL-Ergebnissen. Ich sehe mehrere Möglichkeiten, die sich annähern, aber nicht genau. Ich bin auf SSRS 2005.

Antwort

0

Ohne Verwendung von SQL, um die CSV zu generieren, dann versuchen Sie ein Matrix-Steuerelement, um die Zeilen in Spalten und Gruppen am Datum/Training ändern ... aber Sie haben keine Kommas dazwischen.

+0

könnten Sie String.Replace ("", ",") verwenden, um dies zu umgehen –

0

(Ich bin Kennzeichnung willkürlich Ihre drei Säulen Date, Session und Participant und Tisch MyTable)

ich dir nur im Report-Designer in der Lage sein zu tun, nicht denken wirst. Der beste Weg, den ich sehe, besteht darin, eine skalarwertige Funktion zu schreiben, die einen datetime und einen varchar (oder zwei varchar s) als zwei Eingänge nimmt und einen varchar Ausgang erzeugt. Die Funktion wie folgt aussehen würde:

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)) 

Dann, wenn Sie von MyTable wählen, tun Sie es mit

SELECT Date, Session, dbo.MyFunction(Date, Session) As Participants GROUP BY Date, Session 
0

ich die folgende Abfrage schrieb ein Basisdatensatz mit einem allgemeinen Tabellenausdruck zu bauen und dann eine Gruppierung/Konkatenierungsoperation die Ergebnisse, die ich Sie denken, zu bekommen hier bist:

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 

Dies gibt der folgende:

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 

Sie können diese Ergebnisse wie gewünscht in SSRS formatieren. Es gibt keine Versprechungen, dass dies aufgrund der DISTINCT-Klausel bei einem sehr großen Dataset schnell ausgeführt wird, aber jede Gruppierungsoperation, die Sie für ein großes Dataset ausführen, wäre ohnehin langsam. Die Verwendung der FOR XML-Klausel, wie diese, gilt absolut, wenn es um die Verkettung geht.

Hoffe, das hilft.

0

Die übliche Methode zur Aggregatverkettung in SSRS ist der benutzerdefinierte Code. Sehen Sie hier für ein Beispiel:

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

Hier ist der individuelle Code in Grundform:

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 

durch diese Gefolgt auf der Gruppierungsebene Sie anzeigen möchten:

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