需要处理不被挑选的行

时间:2016-08-15 18:45:33

标签: sql sql-server

在下文中,我们正在挑选所有看过博士的患者,但我们将4名医生从中移除,因为他们已不在我们的医院。这里的问题是,如果患者仅从这4名医生中看到,他们将不会被选中。实际上,我们希望将它们分配给b.Appt_resource_id = 142。我怎么能包括这样的病人?我们从这个sql获取的数据如下所示:

    110811      737470                  Mirta  AVostaquishpe        19  

    102028      664770                  Brune  Alexgdre     19  

    70038       361830                  Pala  Avtila        19  

    44684       112740                  Nani  Verez     19  

    71939       382620                  Alex  Voachim       19  

您可以通过此b.Appt_Resource_ID看到每位患者都被分配给医生。但是,这使得只有4名医生才能看到的病人现在离开了医院。如何包含它们并将它们分配给b.appt_resource_id = 142。

SELECT DISTINCT
    A.Patient_id,
    P.Patient_name,
    P.Patient_Last_Name,
    A.Patient_number,
    b.Appt_resource_id,
    b.appt_resource_descr 
FROM
    [PM].[vwGenPatApptInfo] A
INNER JOIN 
(
    SELECT TOP 100 PERCENT
        patient_id,
        Appt_resource_id,
        appt_resource_descr, 
        COUNT(Appt_resource_id) AS DR_count,
        ROW_NUMBER() OVER (PARTITION BY patient_id ORDER BY COUNT(*) DESC) AS seqnum
    FROM
        [PM].[vwGenPatApptInfo]
    WHERE
        Patient_ID IS NOT NULL AND
        Appt_Sched_Department_ID = 2 AND
        Appt_resource_id not IN (115, 123, 94, 109)
    GROUP BY
        patient_id,
        Appt_resource_id,
        appt_resource_descr
    ORDER BY
        patient_id,
        seqnum 
    ) B
    ON B.Patient_ID = A.Patient_ID  
    AND B.seqnum = 1 
INNER JOIN
    [PM].[vwGenPatInfo] P 
    ON A.Patient_id = P.Patient_id
WHERE
    A.Appt_Cancelled_Date IS NULL AND
    A.Appt_Noshow_date IS NULL

2 个答案:

答案 0 :(得分:0)

取出过滤掉四位医生的行,然后在主SELECT中使用此行:

CASE 
   WHEN b.Appt_resource_id IN (115, 123, 94, 109) THEN 142 
   ELSE b.Appt_resource_id 
END AS Appt_resource_id

答案 1 :(得分:0)

看起来你已经过多地复杂了你的查询。你实际上不想限制你的约会的结果集,你只想在资源ID落在某个值内时更改它,我想也会质疑,因为你可能想知道他们看到了多少不同的医生。为此,您可以使用案例陈述。

这是一个查询,以获得满足计算医生(4更改为1)和约会的标准的患者列表。获取所有约会详细信息将是一种不同类型的查询,但可以这样做,如果这是你想要的,请告诉我们。

SELECT
    p.Patient_id
    ,P.Patient_name
    ,P.Patient_Last_Name
    ,COUNT(DISTINCT CASE WHEN a.Appt_resource_id IN (115, 123, 94, 109) THEN 142 ELSE a.Appt_resource_id END) as DistinctDrCount
    ,COUNT(DISTINCT a.Appt_resource_id) as ActualUnAlteredDrCount
    ,COUNT(*) as NumOfAppointments
FROM
    [vwGenPatApptInfo] a
    INNER JOIN [PM].[vwGenPatInfo] P 
    ON A.Patient_id = P.Patient_id
WHERE
    A.Appt_Cancelled_Date IS NULL AND
    A.Appt_Noshow_date IS NULL
GROUP BY
    p.Patient_id
    ,P.Patient_name
    ,P.Patient_Last_Name