0

まず、私の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の場合でも返されるようにします。

4

2 に答える 2

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になります。

于 2012-06-19T15:37:07.560 に答える
2

テーブルを結合し、それらのテーブルの1つに一致するものがないインスタンスを含める最も簡単な方法は、LEFTOUTERJOINを使用することです。これにより、JOINの右側で一致が見つかったかどうかに関係なく、左側のすべてのレコードが一致します。

r.review_dateはWHERE句に含まれているため、これらの日付の間にレビューがない限り、一致は発生しません。したがって、レビューがないインスタンスを含めるには、以下のように「OR r.review_date IS NULL」を追加して、WHERE句でそれを許可する必要があります。代わりに、round.dateフィールドでのフィルタリングを検討して、その時間枠内に有効なラウンドが実行されたインスタンスのみを確認することもできます。すなわち。「'2012-02-01'と'2012-02-29'の間のro.dateの場所」

例えば。

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

注:ラウンドなしでレコードをレポートする場合は、最初のJOINをLEFTOUTERJOINにする必要もあります。

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
于 2012-06-19T15:38:03.990 に答える