从多个场标准内连接强制记录不同的记录

时间:2016-12-22 21:34:34

标签: sql

我试图根据某些标准返回一份明确的患者名单。我使用内部联接查看符合特定条件的所有患者记录,然后查看MAX服务日期,并进一步查看当天的MAX费用,以强制执行唯一记录。以下是一个简短的例子,显示患者可能在同一服务日期有4次收费。

enter image description here

我想在当天拉出MAX充电以获得明显的记录匹配。但是,我目前的代码是将MAX服务日期与任何找到的服务日期的MAX费用连接起来,创建一个假设记录,如上例所示:

10/3/2016   9/30/2016   Sebert, Stephen L MD  76598   CHG   238

此记录在数据库中不存在,因此我丢失了计数而没有返回匹配以获取患者人口统计信息。我希望这是有道理的。这是我的代码。我使用内部联接来做到这一点。如果有更好的方法,请告诉我。我是否需要进行第二次嵌套内连接才能完成此操作?

SELECT  PAT.V51_PRSNPERSONNUMBER AS PSNNMBR,
(PAT.V51_PRSNFIRSTNAME + ' ' + PAT.V51_PRSNLASTNAME) AS NAME,
ADDR.V8_PERSONHOMEADDRLINE1 AS ADDRESS,
ADDR.V8_PERSONHOMEADDRLINE2 AS ADDRESS2,
ADDR.V8_PERSONHOMEADDRCITY AS CITY,
ADDR.V8_PERSONHOMEADDRSTATE AS STATE,
ADDR.V8_PERSONHOMEADDRZIP AS ZIP,
ADDR.V8_PERSONHOMEPHONENUMBER AS PHONE,
ADDR.V8_PERSONMOBILEPHONENUMBER AS CELLPHONE,
PAT.V51_PRSNEMAIL AS EMAIL,
'LOCASCIO REQUEST' AS GROUPS
FROM I_DNCHGSPMTS CP
LEFT OUTER JOIN IPROCEDURE PR
    ON (CP.DNCP_PROCEDURECODE = PR.PRPROCEDURECODE AND CP.OFFICE_ID = PR.OFFICE_ID)
LEFT OUTER JOIN I_VSTAFFCHGBILL STFBILL
    ON (CP.OFFICE_ID = STFBILL.OFFICE_ID AND CP.DNCP_PRACTICEID = STFBILL.V69_STPRACTICEID AND
        CP.DNCP_STAFFID_CREDITED = STFBILL.V69_STSTAFFID)
LEFT OUTER JOIN I_VPROVCHGBILL BILL
    ON (STFBILL.V69_STSTAFFID = BILL.V58_PROVPROVIDERID AND STFBILL.OFFICE_ID = BILL.OFFICE_ID)
LEFT OUTER JOIN I_DNCHGCOVERAGE CHGCV
    ON (CP.OFFICE_ID = CHGCV.OFFICE_ID AND CP.DNCP_CHARGESID = CHGCV.TPSCHARGESID)
LEFT OUTER JOIN I_VDNPLANCHGCV1 CV
    ON (CHGCV.CHGCVR1PLANID = CV.V9_DNPLANID AND CHGCV.OFFICE_ID = CV.OFFICE_ID)
LEFT OUTER JOIN I_VDEPTCHG DEP
    ON (CP.DNCP_DEPARTMENTCODE = DEP.V4_DPTDEPARTMENTCODE AND CP.OFFICE_ID = DEP.OFFICE_ID)
LEFT OUTER JOIN I_VDNADDRSPAT ADDR
    ON (CP.OFFICE_ID = ADDR.OFFICE_ID AND CP.DNCP_PATIENTID = ADDR.V8_TPSPERSONID)
LEFT OUTER JOIN I_VPERSONPAT PAT
    ON (CP.OFFICE_ID = PAT.OFFICE_ID AND CP.DNCP_PATIENTID = PAT.V51_PRSNPERSONID)
LEFT OUTER JOIN IACCOUNT ACC
    ON (CP.OFFICE_ID = ACC.OFFICE_ID AND CP.DNCP_ACCOUNTSID = ACC.ACCACCOUNTSID)
LEFT OUTER JOIN IPAYMENT PMT
    ON (CP.OFFICE_ID = PMT.OFFICE_ID AND CP.DNCP_PAYMENTSID = PMT.PMTPAYMENTSID)
LEFT OUTER JOIN I_VLUPROCCLASS CL
    ON (PR.OFFICE_ID = CL.OFFICE_ID AND PR.PRCLASS = CL.V85_LUCLOOKUPCODE)
LEFT OUTER JOIN I_VSVCCNTRPROC SVC
    ON (CP.OFFICE_ID = SVC.OFFICE_ID AND CP.DNCP_SERVICECENTERID = SVC.V75_SVCSERVICECENTERID)
LEFT OUTER JOIN I_DNDXPROCEVENT DX
    ON (CP.OFFICE_ID = DX.OFFICE_ID AND CP.DNCP_PROCEDUREEVENTSID = DX.TPSPROCEDUREEVENTSID)
INNER JOIN (
    SELECT  CP.DNCP_PATIENTID AS PSNNMBR,
        MAX(CP.DNCP_FROMSERVICEDATE) AS SVCDT,
        MAX(CP.DNCP_AMOUNT_CHARGE) AS CHGAMT
    FROM I_DNCHGSPMTS CP
        LEFT OUTER JOIN IPROCEDURE PR
            ON (CP.DNCP_PROCEDURECODE = PR.PRPROCEDURECODE AND CP.OFFICE_ID = PR.OFFICE_ID)
        LEFT OUTER JOIN I_VSTAFFCHGBILL STFBILL
            ON (CP.OFFICE_ID = STFBILL.OFFICE_ID AND CP.DNCP_PRACTICEID = STFBILL.V69_STPRACTICEID AND
            CP.DNCP_STAFFID_CREDITED = STFBILL.V69_STSTAFFID)
        LEFT OUTER JOIN I_VPROVCHGBILL BILL
            ON (STFBILL.V69_STSTAFFID = BILL.V58_PROVPROVIDERID AND STFBILL.OFFICE_ID = BILL.OFFICE_ID)
        LEFT OUTER JOIN I_DNCHGCOVERAGE CHGCV
            ON (CP.OFFICE_ID = CHGCV.OFFICE_ID AND CP.DNCP_CHARGESID = CHGCV.TPSCHARGESID)
        LEFT OUTER JOIN I_VDNPLANCHGCV1 CV
            ON (CHGCV.CHGCVR1PLANID = CV.V9_DNPLANID AND CHGCV.OFFICE_ID = CV.OFFICE_ID)
        LEFT OUTER JOIN I_VDEPTCHG DEP
            ON (CP.DNCP_DEPARTMENTCODE = DEP.V4_DPTDEPARTMENTCODE AND CP.OFFICE_ID = DEP.OFFICE_ID)
        LEFT OUTER JOIN I_VDNADDRSPAT ADDR
            ON (CP.OFFICE_ID = ADDR.OFFICE_ID AND CP.DNCP_PATIENTID = ADDR.V8_TPSPERSONID)
        LEFT OUTER JOIN I_VPERSONPAT PAT
            ON (CP.OFFICE_ID = PAT.OFFICE_ID AND CP.DNCP_PATIENTID = PAT.V51_PRSNPERSONID)
        LEFT OUTER JOIN IACCOUNT ACC
            ON (CP.OFFICE_ID = ACC.OFFICE_ID AND CP.DNCP_ACCOUNTSID = ACC.ACCACCOUNTSID)
        LEFT OUTER JOIN IPAYMENT PMT
            ON (CP.OFFICE_ID = PMT.OFFICE_ID AND CP.DNCP_PAYMENTSID = PMT.PMTPAYMENTSID)
        LEFT OUTER JOIN I_VLUPROCCLASS CL
            ON (PR.OFFICE_ID = CL.OFFICE_ID AND PR.PRCLASS = CL.V85_LUCLOOKUPCODE)
        LEFT OUTER JOIN I_VSVCCNTRPROC SVC
            ON (CP.OFFICE_ID = SVC.OFFICE_ID AND CP.DNCP_SERVICECENTERID = SVC.V75_SVCSERVICECENTERID)
        LEFT OUTER JOIN I_DNDXPROCEVENT DX
            ON (CP.OFFICE_ID = DX.OFFICE_ID AND CP.DNCP_PROCEDUREEVENTSID = DX.TPSPROCEDUREEVENTSID)
    WHERE CP.OFFICE_ID = 'EDQV'
        AND CP.DNCP_ACTIVITYTYPE = 'CHG'
        AND SUBSTRING(DEP.V4_DPTNAME,1,5) IN ('PRIMA','WOMEN','URGIC')
        AND (DATEDIFF(DAY,CP.DNCP_POSTDATE,GETDATE())) < 730
    GROUP BY CP.DNCP_PATIENTID
    ) AS MAXSVCDATE
    ON (CP.DNCP_PATIENTID = MAXSVCDATE.PSNNMBR AND CP.DNCP_FROMSERVICEDATE = MAXSVCDATE.SVCDT AND CP.DNCP_AMOUNT_CHARGE = MAXSVCDATE.CHGAMT)
WHERE CP.OFFICE_ID = 'EDQV'

预期结果将是上图中的最高记录,费用为217.非常感谢您提供的任何帮助。谢谢!

1 个答案:

答案 0 :(得分:0)

您不仅要在子查询中对患者进行分组,还要对DNCP_FROMSERVICEDATE进行分组,这样您唯一的最大值就是DNCP_AMOUNT_CHARGE,这样您就可以获得当天的患者列表以及当天的最高费用,然后您就拥有以某种方式过滤,因为你会得到每个病人的倍数,主要查询或日期过滤器上的更多分组或主查询上的MAX(DNCP_AMOUNT_CHARGE),这是你从子查询中提取的唯一列。

希望它有意义。

相关问题