Я пытаюсь написать сценарий TSQL для отчета SSRS, который использует CTE для выбора записей на основе выбранных параметров. Я ищу наиболее эффективный способ сделать это, используя TSQL и / или SSRS. У меня есть 4 параметра, которым можно присвоить значение NULL (все значения) или одно конкретное значение. Затем в моем CTE у меня есть следующая строка:
ROW_NUMBER() over(partition by G.[program_providing_service],G.people_id
order by G.[actual_date] desc) as rowID
Это приведенное выше CTE предназначено для случая, когда Program имеет значение NULL, а People не равно нулю. Мои 4 параметра:
Программа, объект, персонал и люди.
Поэтому я хочу разделять значения только тогда, когда они равны NULL. В настоящее время я реализую это одним CTE в зависимости от значений параметров. Например, если они выберут NULL для всех параметров, кроме People, то этот CTE будет выглядеть так:
ROW_NUMBER() over(partition by G.people_id
order by G.[actual_date] desc) as rowID
Или, если все 5 параметров равны нулю:
ROW_NUMBER() over(partition by G.[program_providing_service], G.[site_providing_service], G.staff_id, G.people_id
order by G.[actual_date] desc) as rowID
Если они не выбирают NULL для любого из 4 параметров, то мне, вероятно, не нужно разбивать по любому полю, так как мне просто нужна первая запись, упорядоченная по убыванию actual_date. Вот как выглядит мой CTE:
;with cte as
(
Select distinct
G.[actual_date],
G.[site_providing_service],
p.[program_name],
G.[staff_id],
G.program_providing_service,
ROW_NUMBER() over(partition by G.[program_providing_service],G.people_id
order by G.[actual_date] desc) as rowID
From
event_log_rv G With (NoLock)
WHERE
...
AND (@ClientID Is Null OR [people_id]=@ClientID)
AND (@StaffID Is Null OR [staff_id] = @StaffID)
AND (@FacilityID Is Null OR [site_providing_service] = @FacilityID)
AND (@ProgramID Is Null OR [program_providing_service] = @ProgramID)
and (@SupervisorID is NULL OR staff_id in (select staff_id from #supervisors))
)
SELECT
[actual_date],
[site_providing_service],
[program_name],
[staff_id],
program_providing_service,
people_id,
rowID
FROM cte WHERE rowid = 1
ORDER BY [Client_FullName]
где строка ROW_NUMBER меняется в зависимости от выбранных параметров. В настоящее время у меня есть 5 операторов IF в этом скрипте TSQL, которые выглядят так:
IF @ProgramID IS NOT NULL AND @ClientID IS NULL
BEGIN
...
END
with one CTE in each of these IF statements:
IF @FacilityID IS NOT NULL AND @ClientID IS NULL
BEGIN
...
END
IF @ProgramID IS NOT NULL AND @ClientID IS NULL
BEGIN
...
END
IF @StaffID IS NOT NULL AND @ClientID IS NULL
BEGIN
...
END
IF @ClientID IS NOT NULL
BEGIN
...
END
Как я могу закодировать все возможные варианты, независимо от того, выбирают ли они NULL или определенные значения?