Сведения о вопросе

Kimsanov

03:21, 7th August, 2020

Теги

Лучший способ выполнения динамического подзапроса в службах MS Reporting Services?

Просмотров: 459   Ответов: 3

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

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

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

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

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



  Сведения об ответе

nYU

05:10, 23rd August, 2020

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


  Сведения об ответе

appple

11:38, 28th August, 2020

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


  Сведения об ответе

davran

00:22, 24th August, 2020

Самый простой метод заключается в следующем:

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-Да, полностью согласен с выступлением.

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

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


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

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

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться