Как включить статическое поле без данных из набора данных для его переноса? - PullRequest
0 голосов
/ 17 мая 2019

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

Вот как выглядит мой запрос. Это работает именно так, как я хочу, пока есть данные.

Select CatName, CatCount, Category = 'Category 1', Sorting = 1
FROM
(Select CatName, Count(CatName) as CatCount FROM DataSet WHERE Parameters)

UNION

Select CatName, CatCount, Category = 'Category 2', Sorting = 2
FROM
(Select CatName, Count(CatName) as CatCount FROM DataSet WHERE Parameters)

Когда есть CatNames и CatCounts для извлечения из оператора select, Категория работает и вытягивается таблицей как группа столбцов. Мне нужно, чтобы все группы существовали всегда.

Однако иногда у нас нет данных, которые соответствуют параметрам для категории. Результатом этого является то, что в поле Категория нет строки для использования, и эта группа не существует в таблице. Есть ли способ заставить поле Category существовать независимо от данных?

Ответы [ 2 ]

0 голосов
/ 18 мая 2019

Нашел решение.Потребовалось несколько попыток, не самых красивых, и мы должны посмотреть, действительно ли это улучшает производительность, но работает ли мы так, как мы хотели.Обобщенный код:

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 вместе.Любые предложения по улучшению этого приветствуются.

0 голосов
/ 17 мая 2019

Если я правильно понимаю вопрос, то вы можете использовать ISNULL .ISNULL возвращает либо значение, которое вы искали (check_expression), либо альтернативное значение (replace_value), если check_expression имеет значение NULL.

ISNULL (check_expression, replace_value)

Select CatName, CatCount, Category = 'Category 2', Sorting = 2
FROM
(Select isnull(CatName,""), Count(CatName) as CatCount FROM DataSet WHERE Parameters)    

РЕДАКТИРОВАТЬ Как насчет левого внешнего соединения?

Select b.CatName, b.CatCount, Category = 'Category 2', Sorting = 2
FROM
(select '' as CatName, 0 as Catcount) a left outer join  (Select CatName, Count(CatName) as CatCount FROM DataSet WHERE Parameters) b on a.CatName = b.CatName 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...