这似乎是一个基本问题,但我无法弄明白(Oracle SQL)。
我需要为多个表中包含的某些访问时间间隔提取患者就诊日期,但其中一个表包含多次访问:
基线表:患者编号,访问日期(这是基线访问)
程序表:患者编号,访问日期(这是程序访问)
跟进表:患者编号,访问时间间隔,访问日期(其中访问时间间隔包含的值如此作为'1个月访问','2个月访问','3个月访问'等。)
我想将每个患者的访问日期表格作为一行,每个访问间隔作为列标题。我尝试使用CASE语句执行此操作,但我为单个患者返回多行。
这是我到目前为止所做的:
SELECT DISTINCT
BASE.PT AS "Patient Number",
BASE.VIST_DATE AS "Baseline",
PROC.VISIT_DATE AS "Procedure",
CASE
WHEN FOLLOWUP.VISIT_INTERVAL = '1_Month'
THEN FOLLOWUP.VISIT_DATE
ELSE NULL END AS "1 Month",
CASE
WHEN FOLLOWUP.VISIT_INTERVAL = '2_Month'
THEN FOLLOWUP.VISIT_DATE
ELSE NULL END AS "2 Month"
FROM BASE
LEFT JOIN PROC
ON BASE.PT=PROC.PT
LEFT JOIN FOLLOWUP
ON BASE.PT=FOLLOWUP.PT
每个患者返回2行,其中1行包含基线,过程和1个月访问日期(2个月列为空),另一行包含基线,过程和2个月访问日期(1个月列null )。我希望每个患者显示1行,并填充所有日期。我显然错过了一些东西(或者总体来说很糟糕)所以我已经发布了求助信息。
谢谢!
答案 0 :(得分:0)
每位患者有两个间隔,因此每位患者都有两排!
您的第一行是“1_month”间隔的行,在此行中您只填充了该列,而对于具有“2_month”间隔和度量的另一行则相同。
为了获得正确的结果,您可以使用聚合:
SELECT
BASE.PT AS "Patient Number",
MAX(BASE.VIST_DATE) AS "Baseline",
MAX(PROC.VISIT_DATE) AS "Procedure",
CASE
WHEN FOLLOWUP.VISIT_INTERVAL = '1_Month'
THEN FOLLOWUP.VISIT_DATE
ELSE NULL END AS "1 Month",
CASE
WHEN FOLLOWUP.VISIT_INTERVAL = '2_Month'
THEN FOLLOWUP.VISIT_DATE
ELSE NULL END AS "2 Month"
FROM BASE
LEFT JOIN PROC
ON BASE.PT=PROC.PT
LEFT JOIN FOLLOWUP
ON BASE.PT=FOLLOWUP.PT
GROUP BY BASE.PT