2012-06-19 85 views
0

首先,我的SQL知識很少生疏。我正在嘗試生成每位患者在一段時間內都經歷過的評價報告。作爲醫生回合的一部分進行審查。以下是有關列對應表:加入三張表的SQL報告

Patients: (id, name) 

Rounds: (id, patient_id, date) 

Reviews: (id, round_id, review) 

報告應如下所示:

Patient  |  Reviews 
_________________________ 

Patient 1 | 2 
_________________________ 
Patient 2 | 1 
_________________________ 
Patient 3 | 0 
_________________________ 

我嘗試以下SQL語句:

SELECT 
    p.name as patient, 
    COUNT(r.round_id) as reviews 
FROM 
    patients as p 
    JOIN rounds as ro ON p.id = ro.patient_id 
    JOIN reviews as r ON ro.id = r.round_id 
WHERE 
    r.review_date between '2012-02-01' AND '2012-02-29' 
GROUP BY 
    p.name 

但是,上述查詢僅返回評論計數大於1的行。即使計數爲0,我也希望它返回。

+0

我不確定是否同樣適用於postgresql,但在T-sql中,對特定列的計數將只計數非空值,而是使用計數(*)。 – Amalea

+1

@Amalea:在PostgreSQL中一樣。這就是標準定義'count()'函數的方式 –

回答

2

最簡單的方式來加入表,幷包括其中一個表中不匹配的情況下,最簡單的方法是使用一個LEFT OUTER JOIN。這將匹配左側的所有記錄,而不管在JOIN的右側是否找到匹配項。

由於您的r.review_date位於您的WHERE子句中,除非在這些日期之間進行審閱,否則不會發生任何匹配。因此,要包含沒有評論的實例,您必須在WHERE子句中添加「OR r.review_date IS NULL」,如下所示。您可能還需要考慮在round.date字段上進行過濾,以便您只查看在該時間範圍內執行了有效回合的情況。即。 「2012-02-01」和「2012-02-29」之間的「2012年2月29日」之間的地點。「

」 「 」

例如。

SELECT 
    p.name as patient, 
COUNT(r.round_id) as reviews 
FROM 
    patients as p 
    JOIN rounds as ro ON p.id = ro.patient_id 
    LEFT OUTER JOIN reviews as r ON ro.id = r.round_id 
WHERE 
    r.review_date between '2012-02-01' AND '2012-02-29' OR r.review_date IS NULL 
GROUP BY 
    p.name 

注意:如果你想,沒有任何發來報告的記錄,你也將不得不作出的第一個加入一個LEFT OUTER JOIN爲好。

FROM 
    patients as p 
    LEFT OUTER JOIN rounds as ro ON p.id = ro.patient_id 
    LEFT OUTER JOIN reviews as r ON ro.id = r.round_id 
+0

這部分解決了這個問題,因爲這個查詢返回與回合表中相同數量的記錄。如果患者沒有輪次記錄怎麼辦?也希望包含這些記錄。可能嗎?感謝你的回答。 –

+0

在我的解決方案結尾處有以下注釋:如果您想要在沒有任何回合的情況下報告記錄,則還必須首先將第一個JOIN添加爲LEFT OUTER JOIN。希望這是你正在尋找的答案。 – Mazrick

+0

完美。謝謝。 –

2
SELECT p.name AS patient 
     , COUNT(r.ID) AS reviews 
FROM patients AS p 
     LEFT JOIN rounds AS ro ON p.id = ro.patient_id 
     LEFT JOIN reviews AS r ON ro.id = r.round_id 
            AND r.review_date BETWEEN '2012-02-01' 
                AND  '2012-02-29' 
GROUP BY p.name 

會給你一個所有患者的名單,包括那些在你的特定日期之間沒有進行過輪次或評論的人。沒有輪次或評論的患者將有一個0.

+0

這部分解決了這個問題,因爲這個查詢返回的記錄數與循環表中的記錄數相同。如果患者沒有輪次記錄怎麼辦?也希望包含這些記錄。可能嗎?感謝你的回答。 –