SQL仅选择满足特定条件的行

时间:2014-01-27 20:10:25

标签: sql oracle select case

这似乎是一个基本问题,但我无法弄明白(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行,并填充所有日期。我显然错过了一些东西(或者总体来说很糟糕)所以我已经发布了求助信息。

谢谢!

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