選択したパラメーターに基づいてレコードを選択するためにCTEを使用するSSRSレポート用のTSQLスクリプトを作成しようとしています。これを行うための最も効率的な方法を、すべてTSQLまたはSSRS、あるいはその両方で探しています。NULL(すべての値)または1つの特定の値に設定できる4つのパラメーターがあります。次に、私の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がNULLでない場合に使用されます。私の4つのパラメータは次のとおりです。
プログラム、施設、スタッフ、そして人々。
したがって、値がNULLの場合にのみ値を分割したいと思います。現在、パラメータ値に応じて1つのCTEでこれを実装しています。たとえば、Peopleを除くすべてのパラメータにNULLを選択した場合、このCTEは次のようになります。
ROW_NUMBER() over(partition by G.people_id
order by G.[actual_date] desc) as rowID
または、5つのパラメーターすべてがnullの場合:
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
4つのパラメーターのいずれにもNULLを選択しない場合は、actual_dateの降順で上位1レコードが必要なため、フィールドでパーティション化する必要はありません。これは私の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行は、選択したパラメーターによって異なります。現在、このTSQLスクリプトには次のような5つのIFステートメントがあります。
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を選択するか特定の値を選択するかにかかわらず、可能なすべてのオプションをコーディングするにはどうすればよいですか?