Как смоделировать «левое соединение» в службах отчетов SQL Server? - PullRequest
1 голос
/ 18 февраля 2009

Я новичок в отчете о svcs и пишу отчет на основе модели отчета (.smdl), созданной в VS.NET 2008. Мне кажется, что я упускаю аналог представления запроса построителя отчетов для "left" присоединиться." Модель очень проста:

Три объекта: Каст (custid, custname) Орд (ordid, custid, orddate, ...) Charge (Charidid, Ordid, тип заряда, значение заряда ...)

Думайте о «плате» как о дополнительной стоимости (особой плате), связанной с заказом - у некоторых заказов они есть, у некоторых - нет.

Модель была автоматически сгенерирована из представлений (.dsv), которые точно указывают на отношения между cust и ord, а также между ord и зарядом. Я отметил, что при разработке отношений представления не было никакой возможности указать (например), что отношение следует рассматривать как «левое соединение».

Теперь я перехожу к построителю отчетов 2 (RB2), чтобы создать отчет на основе этой модели. Моя цель состоит в том, чтобы просто перечислить для каждого заказа: имя клиента, дату заказа, тип оплаты, величину оплаты (то есть строка заказа будет повторяться, если у нее будет более одного типа оплаты). Я хочу перечислить ВСЕ заказы, даже если за заказ не взимается плата - то, что я бы назвал «левым соединением» в традиционном смысле.

Я использую конструктор запросов RB2 для создания набора данных и просто выбираю (т. Е. Дважды щелкаю) объекты, которые мне нужны, в качестве полей в отчете: custname, orddate, chargetype, chargeval. Затем я создаю простую таблицу в отчете на основе этого набора данных.

Когда я запускаю отчет, я получаю только те заказы, которые действительно имеют расходы. Я скорее надеялся получить все заказы. Есть ли способ, которым я могу указать это?

Спасибо, Билл Доусон

Ответы [ 3 ]

3 голосов
/ 24 марта 2009

Я получил ответ через форумы Sql Server:

http://social.msdn.microsoft.com/Forums/en-US/sqlreportingservices/thread/20d4b4fd-dc0b-428e-a5b8-aedf5c53d340

Соответствующая часть от Аарона Мейерса:

Ключевым моментом здесь является то, что все запросы модели отчета сосредоточены вокруг "базовой сущности", и каждая строка на уровне детализации в вашем отчете представляет строку в этой базовой сущности. Вы можете заметить, что в вашей модели нет сущности, которая соответствует «плате за заказ или только за заказ, если у него нет сборов». Вам необходимо явно создать эту сущность Order-Charge в модели на основе именованного запроса в DSV. Этот именованный запрос может просто выбрать ключи из таблицы Ord и таблицы Charge с LEFT OUTER JOIN между ними. Затем вы создаете отношения из этих ключей с таблицами Ord и Charge и обновляете модель (щелкните правой кнопкой мыши корневой узел модели и выберите «Автогенерация»).

Когда вы начнете с подробностей из Ord и перейдете по новой роли в Charge и выберите дополнительные детали, построитель отчетов выберет сущность Order-Charge в качестве корневой / базовой сущности отчета.

Мы рассматриваем функциональность для будущего выпуска, которая позволит создавать эти типы запросов непосредственно в построителе отчетов, не требуя от разработчика модели явного создания объекта LEFT OUTER JOIN.

0 голосов
/ 08 сентября 2014

Мы можем внедрить LEFT JOIN в модель отчета между двумя сущностями, используя свойство Cardinality для роли сущности.

Например, допустим, у нас есть две сущности: Клиент и Заказ.

Клиент -> Роль заказа должна иметь Факультативно один (источник) -> Факультативно много (Цель) {Поскольку 1 клиент может иметь 0 или несколько заказов}

Заказ -> Роль клиента должна иметь Необязательно Много (источник) -> Необязательно Один (Цель) {наоборот}

0 голосов
/ 26 февраля 2009

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

Вы можете проверить фактический запрос, который был выполнен с использованием SQL Profile, что очень удобно для отладки такого рода вещей.

...