3

Запись в таблице содержит ряд допустимых дат, например: * tbl1.start_date * и * tbl1.end_date *. Поэтому, чтобы гарантировать, что я получаю все записи, которые действительны для определенного диапазона дат, логика выбора: <...> WHERE end_date >= @dtFrom AND start_date < @dtTo (параметр @dtTo, используемый в инструкции SQL, фактически является расчетным на следующий день параметра * @ prmDt_To *, используемого в отчет).SSRS 2008 - множественные группировки для диапазона дат

Теперь в отчете мне нужно подсчитать количество записей за каждый день в указанном диапазоне данных и включить дни, если они есть, для которых не было действительных записей. Таким образом, полученная запись может быть подсчитана в несколько разных дней. Я могу сделать это относительно легко с рекурсивным CTE в наборе данных, но мое эмпирическое правило заключается в том, чтобы избежать ненужной загрузки базы данных SQL и вместо этого вернуть только необходимые необработанные данные и позволить процессору Report обрабатывать группировки. Итак, есть ли способ сделать это в SSRS?

Спасибо, Сергей

ответ

1

Вы могли бы быть в состоянии сделать что-то в SSRS с помощью специального кода, но я рекомендую против него. Место для этого - в наборе данных. SSRS не предназначен для заполнения групп, которые не существуют в наборе данных. Это похоже на то, что вы пытаетесь сделать: SSRS необходимо создать группы для каждой даты, независимо от того, находится ли эта дата в наборе данных.

Если в вашей базе данных нет номера или даты, я бы просто создал рекурсивный CTE с записью для каждой даты в интересующем вас диапазоне, как вы упомянули. Затем внешние присоедините это к вашему столу и используйте COUNT(tbl1.start_date), чтобы найти подходящие дни. Это не должно быть слишком болезненным запросом для SQL-сервера.

Если вам действительно нужно избегать CTE, я бы создал таблицу с датой или числом, чтобы использовать для создания дат в вашем диапазоне.

+0

Рекурсивный КТЭ, по-видимому, является болезненным запросом, всего за пару дней извлечение данных занимает почти 20 секунд, что неприемлемо в среде, в которой этот отчет разработан. Если я просто извлечу данные для диапазона дат, без CTE, выполнение будет менее 2 секунд. Вот почему я пытаюсь создать механизм для создания Report Designer. – krysolov

+0

Часть этого будет зависеть от данных, которые вы присоединяетесь к CTE. Попробуйте заменить CTE на таблицу temp, чтобы узнать, изменит ли это производительность. Если это так, то SQL выбирает плохой план для CTE, но таблица temp должна быть прекрасным обходным решением. Кроме того, убедитесь, что у вас есть соответствующие индексы на ваших таблицах. –