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

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

  • Query to get a list of popular IDs
  • Subquery on each item to get properties from another table

В идеале столбцы итогового отчета должны выглядеть так:

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

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

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
0
10 079
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

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

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

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? Нет. Абсолютно нет. Не для чего-то такого простого.

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

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

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

Другие вопросы по теме