SSRS 2005: изменить отображение столбца со значения столбца элемента / одной строки на другое? - PullRequest
1 голос
/ 17 апреля 2009

У меня есть таблица / набор данных вроде:

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 голосов
/ 29 сентября 2009

Я закончил с помощью оператора SQL stuff / xml в части выбора t-sql с присоединением к общим данным выбора. Примерно так: http://www.kodyaz.com/articles/concatenate-using-xml-path.aspx

0 голосов
/ 10 июня 2009

Обычный способ выполнения агрегированной конкатенации в 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" 
   )
0 голосов
/ 21 мая 2009

(я произвольно обозначаю ваши три столбца Date, Session и Participant и вашу таблицу MyTable)

Не думаю, что вы сможете сделать это исключительно в конструкторе отчетов. Лучший способ сделать это - написать скалярную функцию, которая принимает datetime и varchar (или два varchar s) в качестве двух входных данных и выдает 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
0 голосов
/ 10 июня 2009

Я написал следующий запрос для построения базового набора данных, используя общее табличное выражение, а затем операцию группировки / объединения, чтобы получить результаты, которые, я думаю, вы ищете:

    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 абсолютно справедливо, когда речь идет о конкатенации.

Надеюсь, это поможет.

0 голосов
/ 18 апреля 2009

Без использования SQL для генерации CSV, затем попробуйте матричный элемент управления, чтобы изменить строки на столбцы и группы на дату / тренировку ... но между ними не будет запятых.

...