0

我对开发相当陌生,如果我的问题很愚蠢,很抱歉。我已经将许多列连接在一起,并且它在一对多关系表之间也有连接。无论如何,我现在得到的输出是

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 条保险记录,即患者 ID 的主要保险和次要保险。有什么方法可以为每个患者 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());
4

3 回答 3

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'
于 2013-08-14T18:50:02.873 回答
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)
于 2013-08-14T18:51:35.540 回答
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)
于 2013-08-14T18:52:29.490 回答