如何在返回多个相同的记录时加入?

时间:2013-08-14 18:47:43

标签: sql join

我对发展很新,很抱歉,如果我的问题很愚蠢。 我已将多个列连接在一起,并且它也在一对多关系表之间进行连接。 无论如何,我现在得到的输出是

Patient_Name    episode_id  DOB     primary_insu        sec_insur   patient_id
name,                    001    03-29-1956  MEDICAID            NULL     12
name,                    001    03-29-1956  NULL         STATEPROB     12
name2                    001    02-20-1981  AETNA             NULL      13
name2                    001    02-20-1981  NULL           MEDICAID      13

有一张表有2个保险记录,这是患者身份证的主要保险和二级保险。有什么方法可以为每个patient_id在一行中显示它。

当前查询...

SELECT LTRIM(RTRIM(isnull(pat.LNAME, ''))) + ', ' + LTRIM(RTRIM(isnull(pat.FNAME, ''))) + ', ' + LTRIM(RTRIM(isnull(pat.MNAME, ''))) AS Patient_Name,
       pat.episode_id,
       CONVERT (VARCHAR (11), pat.dob, 110) AS DOB,
       CASE 
       WHEN covh.copay_priority = '1' THEN covp.payor_ID ELSE NULL 
       END AS primary_insu,
       CASE 
       WHEN covh.copay_priority = '2' THEN covp.payor_ID 
       END AS sec_insur
FROM   Patient AS pat WITH (NOLOCK)
       INNER JOIN
       coverage_history AS covh WITH (NOLOCK)
       ON pat.patient_id = covh.patient_id
          AND pat.episode_id = covh.episode_id
       INNER JOIN
       coverage AS cov WITH (NOLOCK)
       ON cov.patient_id = covh.patient_id
          AND cov.episode_id = covh.episode_id
          AND cov.hosp_status_code = covh.hosp_status_code
          AND cov.coverage_plan_id = covh.coverage_plan_id
       LEFT OUTER JOIN
       coverage_plan AS covp WITH (NOLOCK)
       ON covp.coverage_plan_id = covh.coverage_plan_id
          AND covp.hosp_status_code = covh.hosp_status_code
WHERE  covh.hosp_status_code = 'op'
       AND (covh.effective_to IS NULL
            OR covh.effective_to > GETDATE());

3 个答案:

答案 0 :(得分:0)

您可以两次加入桌面以获得主要内容,然后一次获得次要内容。使用左连接,因为并非所有患者都有保险。示例如下。您需要根据实际的表格结构和获取其他信息所需的任何其他连接进行调整。

SELECT p.Patient_name,  i1.insurancename AS primary_insure, i2.insuranceName AS secondary_insure
FROM patient P
LEFT JOIN PatientInsurance i1 ON p.patient_id = i1.patient_id AND i1.insurance_type = 'Primary'
LEFT JOIN PatientInsurance i2 ON p.patient_id = i2.patient_id  AND i2.insurance_type = 'Secondary'

答案 1 :(得分:0)

您可以使用MAX()来组合行:

SELECT LTRIM(RTRIM(isnull(pat.LNAME, ''))) + ', ' + LTRIM(RTRIM(isnull(pat.FNAME, ''))) + ', ' + LTRIM(RTRIM(isnull(pat.MNAME, ''))) AS Patient_Name,
       pat.episode_id,
       CONVERT (VARCHAR (11), pat.dob, 110) AS DOB,
       MAX(CASE 
       WHEN covh.copay_priority = '1' THEN covp.payor_ID ELSE NULL 
       END) AS primary_insu,
       MAX(CASE 
       WHEN covh.copay_priority = '2' THEN covp.payor_ID 
       END) AS sec_insur
FROM   Patient AS pat WITH (NOLOCK)
       INNER JOIN
       coverage_history AS covh WITH (NOLOCK)
       ON pat.patient_id = covh.patient_id
          AND pat.episode_id = covh.episode_id
       INNER JOIN
       coverage AS cov WITH (NOLOCK)
       ON cov.patient_id = covh.patient_id
          AND cov.episode_id = covh.episode_id
          AND cov.hosp_status_code = covh.hosp_status_code
          AND cov.coverage_plan_id = covh.coverage_plan_id
       LEFT OUTER JOIN
       coverage_plan AS covp WITH (NOLOCK)
       ON covp.coverage_plan_id = covh.coverage_plan_id
          AND covp.hosp_status_code = covh.hosp_status_code
WHERE  covh.hosp_status_code = 'op'
       AND (covh.effective_to IS NULL
            OR covh.effective_to > GETDATE())
GROUP BY LTRIM(RTRIM(isnull(pat.LNAME, ''))) + ', ' + LTRIM(RTRIM(isnull(pat.FNAME, ''))) + ', ' + LTRIM(RTRIM(isnull(pat.MNAME, ''))),
       pat.episode_id,
       CONVERT (VARCHAR (11), pat.dob, 110)

答案 2 :(得分:0)

您可以使用不同的条件和别名连接到同一个表两次。

   SELECT 
    LTRIM(RTRIM(isnull(pat.LNAME,''))) + ', ' + LTRIM(RTRIM(isnull(pat.FNAME,''))) + ', ' + LTRIM(RTRIM(isnull(pat.MNAME,''))) AS Patient_Name, 
    pat.episode_id, 
    convert(varchar(11),pat.dob,110) AS DOB, 
    pIns.payor_ID AS Primary, 
    sIns.payor_ID AS Secondary
from 
    Patient pat with (nolock) 
    left join coverage_history pIns with (nolock) on 
        (pat.patient_id=pIns.patient_id)
        and 
        (pat.episode_id=pIns.episode_id)
        and 
        (pIns.copay_priority = '1')
    left join coverage_history sIns with (nolock) on 
        (pat.patient_id=sIns.patient_id)
        and 
        (pat.episode_id=sIns.episode_id)
        and 
        (sIns.copay_priority = '2')
 (remainder of where clause)