私の組織では、クライアントは一度に複数のプログラムに登録できます。クライアントが一意の行として登録されているすべてのプログラムのリストと、そのプログラムに登録された日付を含むテーブルがあります。
外部結合を使用すると、テーブル (クライアントが完了したテストのテーブルなど) から任意のクライアント名と日付を取得し、その特定の日付にクライアントが参加していたすべてのプログラムを返すことができます。クライアントがその日に複数のプログラムに参加していた場合、その日に参加していた各プログラムのテーブルのデータが複製されます。
私が抱えている問題は、その日に複数のプログラムに参加していたとしても、クライアントと日付ごとに「プライマリ プログラム」として 1 つのプログラムのみを返すことを探していることです。プログラムをプライマリ プログラムとして選択して返す階層を作成しました。
例えば:
1.)入院患者
2.)外来診療
3.)専門外来
4.) レクリエーション外来
そのため、クライアントがその日に外来診療、専門外来、娯楽外来に同時に登録された場合、プログラムとして「外来診療」のみが返されます。
これを行うための私の考え方は、次のように以前のプログラムでテーブルに複数回参加することです。
FROM dbo.TestTable as TestTable
LEFT OUTER JOIN dbo.PreviousPrograms as PreviousPrograms1
ON TestTable.date = PreviousPrograms1.date AND PreviousPrograms1.type = 'Inpatient'
LEFT OUTER JOIN dbo.PreviousPrograms as PreviousPrograms2
ON TestTable.date = PreviousPrograms2.date AND PreviousPrograms2.type = 'Outpatient Clinical'
LEFT OUTER JOIN dbo.PreviousPrograms as PreviousPrograms3
ON TestTable.date = PreviousPrograms3.date AND PreviousPrograms3.type = 'Outpatient Vocational'
LEFT OUTER JOIN dbo.PreviousPrograms as PreviousPrograms4
ON TestTable.date = PreviousPrograms4.date AND PreviousPrograms4.type = 'Outpatient Recreational'
次に、SELECT ステートメントで条件 CASE WHEN を次のように実行します。
SELECT
CASE
WHEN PreviousPrograms1.name IS NOT NULL
THEN PreviousPrograms1.name
WHEN PreviousPrograms1.name IS NULL AND PreviousPrograms2.name IS NOT NULL
THEN PreviousPrograms2.name
WHEN PreviousPrograms1.name IS NULL AND PreviousPrograms2.name IS NULL AND PreviousPrograms3.name IS NOT NULL
THEN PreviousPrograms3.name
WHEN PreviousPrograms1.name IS NULL AND PreviousPrograms2.name IS NULL AND PreviousPrograms3.name IS NOT NULL AND PreviousPrograms4.name IS NOT NULL
THEN PreviousPrograms4.name
ELSE NULL
END as PrimaryProgram
より大きな問題は、私の実際のテーブルには、可能なプログラムが 4 つだけではなく、CASE WHEN select ステートメントと JOIN がすでに十分に面倒であることです。
SELECTs 部分または JOIN 部分をより効率的に行う方法はありますか? それとも、すべてを一緒に行うためのより良い方法でしょうか?
SQL Server 2008 を使用しています。