TablePatient.Patient_ID(PK)
TableProviders.Encounter (joins to PK)
TableProviders.Provider_Type
TableProviders.Provider_ID
TableNames.Full_Name
TableNames.Provider_ID (joins to Table Names)
我想要一个查询,它将为所有Patient_IDs
提供每个Provider ID
的提供程序Full_Name
。
大约有 30 provider_types
.
我已经使用左连接大量左连接来做到这一点。 运行需要很长时间,我认为我缺少一个技巧。
有什么帮助吗?
好的,我之前的回答完全不符合你的意思。您希望对表进行透视,以便在每行上有一个Patient_ID
,每个Full_name
每个provider_type
。我假设每个患者只有一种类型的提供者,而不是更多;如果更多,每个患者将有不止一行,无论如何我认为这真的是不可能的。
这是我的枢轴解决方案。第一部分是使其更易于理解,因此我在子查询中创建一个名为 TABLE_PATIENT
的表。
WITH TABLE_PATIENT AS
(
SELECT TablePatient.Patient_ID,
TableProviders.Provider_Type,
TableNames.Full_Name
FROM TablePatient LEFT JOIN
TableProviders on TablePatient.Patient_ID = TableProviders.Encounter
LEFT JOIN
TableNames on TableNames.Provider_ID = TableProviders.Provider_ID
group by TablePatient.Patient_ID,
TableProviders.Provider_Type,
TableNames.Full_Name
)
SELECT *
FROM TABLE_PATIENT
PIVOT
(
min(Full_name)
for Provider_type in ([type1], [type2],[type3])
) AS PVT
因此,TABLE_PATIENT
每个患者只有许多行,每行有一个提供者,枢轴将所有内容放在一行上。如果有什么地方不起作用,请告诉我。
您需要在[type1],[type2]等中编写所需的每种类型。只需将它们放在 [] 中,不需要其他字符作为 ' 或其他任何东西。
如果仅放置某些类型,则查询不会显示其他类型的提供程序。
如果有什么地方不起作用,请告诉我。
如果我明白你的意思,你只想按患者 ID 然后按提供者 ID 对答案进行分组。全名在提供商 ID 上是唯一的,对吗?
这应该是这样的
SELECT TablePatient.Patient_ID,
TableProviders.Provider_ID,
TableNames.Full_Name
FROM TablePatient LEFT JOIN
TableProviders on TablePatient.Patient_ID = TableProviders.Encounter
LEFT JOIN
TableNames on TableNames.Provider_ID = TablerProviders.Provider_ID
group by TablePatient.Patient_ID,
TableProviders.Provider_ID,
TableNames.Full_Name
您可以按TableNames.Full_Name
分组,也可以选择First(TableNames.Full_Name)
例如,如果提供商 ID 确实有全名。
注意:我使用了SQL服务器语法,与Oracle可能存在差异。