在我的组织中,客户可以一次注册多个项目。我有一个表格,其中列出了客户作为唯一行注册的所有计划以及他们注册该计划的日期。
使用外部联接,我可以从表中获取任何客户名称和日期(比如客户已完成的测试表),并让它返回客户在该特定日期参与的所有程序。如果客户在该日期参加了多个项目,它会为他们在该日期参加的每个项目复制该表中的数据。
我遇到的问题是,我希望它只为每个客户和日期返回一个程序作为他们的“主要程序”,即使他们在那个日期在多个程序中也是如此。我已经创建了一个层次结构,应该选择哪个程序作为他们的主要程序并返回。
例如:
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
更大的问题是,在我的实际表中,它可能不仅仅是四个可能的程序,而且 CASE WHEN 选择语句和 JOIN 已经够麻烦了。
是否有更有效的方法来执行 SELECTs 部分或 JOIN 部分?或者可能是一个更好的方法来一起完成这一切?
我正在使用 SQL Server 2008。