Отчет SSRS с таблицами «многие ко многим» в подтабликсе

У меня есть основная таблица (Таблица A). Он имеет отдельные отношения «многие ко многим» с двумя другими таблицами (таблица B и таблица C).

Я хотел бы создать отчет SSRS, который имеет одну строку для каждой записи в таблице A, но затем отображает подтаблицу для каждой таблицы B и таблицы C в одном из столбцов.

Я считаю, что могу сделать это, создав вложенный отчет для таблицы B и таблицы C, передав идентификатор таблицы A каждому из двух вложенных отчетов. Однако мне интересно, возможно ли это сделать без создания подотчетов.

Ниже приведен пример структуры данных и того, как должен выглядеть отчет.

Структура данных

Желаемый формат отчета


person kralco626    schedule 27.11.2019    source источник
comment
Возможно, у вас получится это сделать, если вы сможете собрать все данные в один набор данных. Основная проблема с вложением табликсов в другие табликсы заключается в том, что наборы данных обычно не совпадают.   -  person Steve-o169    schedule 27.11.2019
comment
Итак, я могу получить все это в одном и том же наборе данных, но данные не совсем понятны. Если запись в таблице A относится к 2 записям в таблице B и 3 записям в таблице C, то мой полный набор данных содержит 6 записей. Что, я думаю, технически не было бы проблемой, если бы я мог понять, как правильно их сгруппировать, чего я не могу. Если мы опустили таблицу B или таблицу C, то это работает, но с двумя отдельными «многие ко многим» я не могу получить право на группировку для отображения данных. Все, что я пробую, имеет лишние строки из-за проблемы 2x3=6...   -  person kralco626    schedule 27.11.2019
comment
Итак, если я правильно визуализирую ваши данные, есть 6 строк - некоторые должны иметь значения NULL для C ID, а другие для B ID... На основе этого может быть возможно фильтровать подтаблицы. Для подтаблицы B - IIF(IsNothing(Fields!C_ID.Value), Nothing, Fields!B_ID.Value) или что-то в этом роде. Или просто скройте строки, где C_ID равно NULL.   -  person Steve-o169    schedule 29.11.2019


Ответы (1)


Это немного затянуто, так как у меня не было образцов данных для работы. Я создал примерные данные следующим образом.

CREATE TABLE TableA(aID int, a1 varchar(20), a2 varchar(20))
GO
CREATE TABLE TableB(bID int, b1 varchar(20), b2 varchar(20))
GO
CREATE TABLE TableC(cID int, c1 varchar(20), c2 varchar(20))
GO
INSERT INTO TableA VALUES (1,'Red', 'Green'), (2,'Blue', 'Purple')

INSERT INTO TableB VALUES (1,'Dave', 'Bob'), (1,'Geoff', 'Harry'), (2,'Jane', 'Mary'), (2,'Anne', 'Sue')

INSERT INTO TableC VALUES (1,'Dog', 'Cat'), (2,'Goat', 'Cow'), (2,'Sheep', 'Lamb'), (2,'Donkey', 'Horse'), (2,'Lizard', 'Frog')

Затем я создал запрос, который объединяет таблицы вместе, он включает столбец «TableName», чтобы указать, из какой таблицы он взят, мы будем использовать его для упорядочивания столбцов в матрице. Он также содержит номер строки для каждой строки в таблице. Запрос выглядит так.

SELECT 
    * 
    , RowN = ROW_NUMBER() OVER(PARTITION BY aID, TableName ORDER BY ID, FirstColumn, SecondColumn)
    FROM (
SELECT 
        a.*
        , 'Table B' as TableName
        , bID as ID, b1 as FirstColumn, b2 as SecondColumn
    FROM TableA a 
        JOIN TableB b on a.aID = b.bID
UNION ALL
SELECT 
        a.*
        , 'Table C' as TableName
        , c.*
    FROM TableA a 
        JOIN TableC c on a.aID = c.cID
    ) u

В дизайнере портов я добавил управление матрицей. Я установил группы строк для группировки по aID и Rown и добавил группу столбцов по TableName .

Наконец, я установил для свойства Hide duplicates первых трех столбцов значение DataSet1.

Дизайн отчета выглядит следующим образом. .com/e3cRj.png" alt="введите здесь описание изображения">

Конечный результат выглядит так...

введите здесь описание изображения

Это не идеально, но этого должно быть достаточно, чтобы вы начали.

person Alan Schofield    schedule 03.12.2019