2008-08-21 10 views
0

Я новичок в службах отчетов SQL Server, и было интересно, что лучший способ сделать следующее:Лучший способ выполнить динамический подзапрос в службах MS Reporting Services?

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

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

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

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

ответ

2

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

0

метод Простейшая заключается в следующем:

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 

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


UPDATE от 21 августа '08 в 21:27:
@AlexCuse - Да, полностью согласен с исполнением.

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

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


UPDATE от 21 августа '08 в 22:07:
Чтобы ответить на другие части вашего вопроса - это функция VB путь? Нет. Абсолютно нет. Не для чего-то такого простого.

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

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

0

В зависимости от того, как вы хотите, чтобы результат выглядел, может быть создан подчиненный отчет, или вы можете группировать по идентификатору, свойству 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 Я думаю, что вы найдете внешнее объединение лучшего исполнителя, чем коррелированные подзапросы в примере вы дали. Помните, что подзапрос должен выполняться для каждой строки.