Нашел решение.Потребовалось несколько попыток, не самых красивых, и мы должны посмотреть, действительно ли это улучшает производительность, но работает ли мы так, как мы хотели.Обобщенный код:
Select C.CatName, C.CatCount, Category = 'Category 1', Sorting = 1
FROM
(Select Top 5 B.CatName, Count(B.CatName) as CatCount
FROM
(Select CatName = case when CatOnlyParam in (Category1Filter) then A.CatName else NULL end
FROM
(Select CatName FROM DataSet WHERE GeneralParameters) as A
) as B
order by CatCount
) as C
UNION
etc
Разделение параметров на разные этапы гарантирует, что будут значения для каждой категории, даже если эти значения равны NULL.Я уверен, что есть более чистый способ получить тот же эффект, но это работает.
Работа изнутри:
Этап 1 (Выберите оператор A): выбирает значение из набора данных с очень общими параметрами (между датой начала и конца, разрешено или нет и т. Д.).
Этап 2 (Оператор выбора B): Использует инструкцию case для извлечения только тех данных, которые релевантны для этого отдела, оставляя за NULL данные, которых нет.
Этап 3 (Оператор выбора C): берет данные из списка имен и NULL и получает из них счетчик.Сортировка по этому количеству и занимает верхние 5. Если у категории нет данных, то нулевые значения будут «подсчитаны» до 0 и переданы на последний шаг.
Этап 4 (последнее утверждение выбора): добавляет статические поля к информации из предыдущего шага.Категория без данных будет передана следующим образом:
CatName: NULL
CatCount: 0
Category: "Category 1"
Sorting: 1
Затем это повторяется для других категорий и UNION вместе.Любые предложения по улучшению этого приветствуются.