0

首先,SQL 是由服务器动态处理的,因此我的WHERE子句中的某些项目对您来说可能看起来很奇怪,请忽略这些,因为它们不是问题。

根据我的客户要求,他们需要UNION在其他两种情况下更新我的报告(/没有患者就诊的患者/)和(/没有预约的患者/)。我需要帮助将这两个子集的患者添加到我的最终更新查询中。在目前的状态下,它只是增加了#Temp患者,我需要合并额外的患者。

任何帮助是极大的赞赏。

我当前的 SQL 更新 -

DECLARE @Inactive INT
DECLARE @Active INT
DECLARE @PatientProfileId INT

SELECT
    @Inactive = MedlistsId
FROM
    Medlists
WHERE
    TableName = 'PatientProfileStatus'
    AND Code = 'I'

SELECT
    @Active = MedlistsId
FROM
    Medlists
WHERE
    TableName = 'PatientProfileStatus'
    AND Code = 'A'

CREATE TABLE #Temp
    (
      PatientName VARCHAR(120) ,
      PatientProfileId INT ,
      RecentId INT ,
      Recent DATETIME
    )

INSERT  INTO #Temp
        SELECT
            dbo.FormatName(pp.Prefix , pp.First , pp.Middle , pp.Last , pp.Suffix) AS Name ,
            pp.PatientProfileId ,
            MAX(pv.PatientVisitId) AS RecentId ,
            MAX(pv.Visit) AS Recent
        FROM
            PatientVisit pv
            INNER JOIN PatientProfile pp ON pv.PatientProfileId = pp.PatientProfileId
                                            AND pp.PatientStatusMId = @Active
        WHERE
            pp.PatientProfileId IN ( SELECT
                                        a.OwnerId
                                     FROM
                                        Appointments a
                                        INNER JOIN PatientProfile pp ON a.OwnerId = pp.PatientProfileId
                                                                        AND a.ApptKind = 1
                                                                        AND pp.PatientStatusMId = @Active
                                     GROUP BY
                                        a.OwnerId ,
                                        a.ApptKind
                                     HAVING
                                        MAX(a.ApptStart) < '07/30/2005' )
        GROUP BY
            dbo.FormatName(pp.Prefix , pp.First , pp.Middle , pp.Last , pp.Suffix) ,
            pp.PatientProfileId
        HAVING
            MAX(pv.Visit) < '07/30/2005' 

/*Patients without a Appointment*/

IF 1 = 1 
    INSERT  INTO #Temp
            SELECT
                dbo.FormatName(pp.Prefix , pp.First , pp.Middle , pp.Last , pp.Suffix) AS Name ,
                pp.PatientProfileId ,
                NULL AS RecentId ,
                NULL AS Recent
            FROM
                PatientProfile pp
                LEFT JOIN ( SELECT * FROM Medlists WHERE TableName = 'PatientProfileStatus' ) ml1 ON pp.PatientStatusMId = ml1.MedlistsId
                LEFT JOIN Appointments a ON a.Ownerid = pp.PatientProfileId
                                            AND a.ApptKind = 1
                LEFT JOIN PatientVisit pv ON a.PatientVisitId = pv.PatientVisitId
            WHERE
                ml1.Code = 'A'
                AND a.ownerid IS NULL
                AND --Filter on Age
                (
                  ((
                     '-1' = '-1'
                     AND '40' = '125'
                   )
                  OR ( CAST(( DATEDIFF(DAY , pp.Birthdate , GETDATE()) / 365.25 ) AS INT) BETWEEN ( '-1' ) AND ( '40' ) ))
                )

/*Patients without a Patient Visit*/

IF 0 = 1 
    INSERT  INTO #Temp
            SELECT
                dbo.FormatName(pp.Prefix , pp.First , pp.Middle , pp.Last , pp.Suffix) AS Name ,
                pp.PatientProfileId ,
                NULL AS RecentId ,
                NULL AS Recent
            FROM
                PatientProfile pp
                LEFT JOIN PatientVisit pv ON pv.PatientProfileid = pp.PatientProfileid
                LEFT JOIN ( SELECT * FROM Medlists WHERE TableName = 'PatientProfileStatus' ) ml1 ON pp.PatientStatusMId = ml1.MedlistsId
            WHERE
                ml1.Code = 'A'
                AND pv.patientprofileid IS NULL
                AND --Filter on Age
                (
                  ((
                     '-1' = '-1'
                     AND '40' = '125'
                   )
                  OR ( CAST(( DATEDIFF(DAY , pp.Birthdate , GETDATE()) / 365.25 ) AS INT) BETWEEN ( '-1' ) AND ( '40' ) ))
                )   

DECLARE curPatient CURSOR FORWARD_ONLY READ_ONLY LOCAL
FOR
    SELECT
        t.PatientProfileId
    FROM
        #Temp t
        JOIN PatientProfile pp ON t.PatientProfileId = pp.PatientProfileId
        JOIN PatientVisit pv ON pp.PatientProfileId = pv.PatientProfileId
                                AND pv.PatientVisitId = t.RecentId
    WHERE
        --Filter on Age
        (
          ((
             '-1' = '-1'
             AND '40' = '125'
           )
          OR ( CAST(( DATEDIFF(DAY , pp.Birthdate , GETDATE()) / 365.25 ) AS INT) BETWEEN ( '-1' ) AND ( '40' ) ))
        )

OPEN curPatient
FETCH NEXT FROM curPatient INTO @PatientProfileId

WHILE @@FETCH_STATUS = 0 
    BEGIN  

        UPDATE
            PatientProfile
        SET 
            PatientStatusMId = @Inactive ,
            pstatus = 'I'
        FROM
            PatientProfile P
            INNER JOIN #Temp t ON t.PatientProfileID = P.PatientProfileID
        WHERE
            p.PatientProfileId = @PatientProfileId 


        FETCH NEXT FROM curPatient INTO @PatientProfileId 
    END 

CLOSE curPatient
DEALLOCATE curPatient   

DROP TABLE #Temp
4

1 回答 1

0

这将仅限于有预约的患者

LEFT JOIN Appointments a 
       ON a.Ownerid = pp.PatientProfileId
      AND a.ApptKind = 1

这将仅限于访问过的患者

LEFT JOIN PatientVisit pv 
       ON pv.PatientProfileid = pp.PatientProfileid

尝试

LEFT OUTER JOIN Appointments a 
           ON a.Ownerid = pp.PatientProfileId
          AND a.ApptKind = 1
Where a.Ownerid is null


LEFT OUTER JOIN PatientVisit pv 
       ON pv.PatientProfileid = pp.PatientProfileid
Where pv.PatientProfileid is null
于 2012-12-28T17:02:35.750 回答