Лучший способ выполнить динамический подзапрос в MS Reporting Services? - PullRequest
0 голосов
/ 21 августа 2008

Я новичок в службах отчетов SQL Server, и мне было интересно, как сделать следующее:

  • Запрос, чтобы получить список популярных идентификаторов
  • Подзапрос для каждого элемента для получения свойств из другой таблицы

В идеале столбцы окончательного отчета должны выглядеть следующим образом:

[ID] [property1] [property2] [SELECT COUNT(*)
                              FROM AnotherTable 
                              WHERE ForeignID=ID]

Могут быть способы создания гигантского запроса SQL, чтобы сделать все это за один раз, но я бы предпочел разделить его Рекомендуется ли написать функцию VB для выполнения подзапроса для каждой строки? Спасибо за любую помощь.

Ответы [ 3 ]

2 голосов
/ 21 августа 2008

Я бы рекомендовал использовать SubReport . Вы бы поместили подотчет в ячейку таблицы.

0 голосов
/ 22 августа 2008

В зависимости от того, как вы хотите, чтобы вывод выглядел, подотчет мог подойти, или вы могли бы сгруппировать по ID, property1, property2 и показать элементы из вашей другой таблицы как подробные элементы (при условии, что вы хотите показать больше, чем просто подсчет) .

Что-то вроде

select t1.ID, t1.property1, t1.property2, t2.somecol, t2.someothercol
from table t1 left join anothertable t2 on t1.ID = t2.ID

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

0 голосов
/ 21 августа 2008

Самый простой способ это:

select *,
 (select count(*) from tbl2 t2 where t2.tbl1ID = t1.tbl1ID) as cnt
from tbl1 t1

вот рабочая версия (с использованием табличных переменных):

declare @tbl1 table
(
 tbl1ID int,
 prop1 varchar(1),
 prop2 varchar(2)
)

declare @tbl2 table
(
 tbl2ID int,
 tbl1ID int
)

select *,
 (select count(*) from @tbl2 t2 where t2.tbl1ID = t1.tbl1ID) as cnt
from @tbl1 t1

Очевидно, что это всего лишь необработанный пример - применяются стандартные правила, такие как не выбирать * и т.д ...


ОБНОВЛЕНИЕ с 21 августа 2008 года в 21: 27:
@AlexCuse - Да, полностью согласен с работой.

Я начал писать это с внешним соединением, но затем увидел в его примере выходных данных счетчик и подумал, что это то, что он хотел, и счетчик не вернется правильно, если таблицы будут внешне объединены. Не говоря уже о том, что объединения могут привести к умножению ваших записей (1 запись из tbl1, которая соответствует 2 записям в tbl2 = 2 возвратах), что может быть непреднамеренным.

Так что, я думаю, все сводится к тому, что должен вернуть ваш запрос.


ОБНОВЛЕНИЕ с 21 августа 2008 года в 22: 07:
Чтобы ответить на другие части вашего вопроса - это функция VB путь? Абсолютно нет. Не для чего-то такого простого.

Функции очень плохи по производительности, каждая строка в возвращаемом наборе выполняет функцию.

Если вы хотите «разделить» различные части запроса, вам нужно подходить к нему больше как к хранимой процедуре. Создайте временную таблицу, выполните часть запроса и вставьте результаты в таблицу, затем выполните любые дополнительные запросы и обновите исходную временную таблицу (или вставьте в дополнительные временные таблицы).

...