2016-10-30 60 views
1

我正在使用一個(虛構的)醫院的數據庫。我有以下表格:外部全部加入和空值:每年成功的醫療注意事項#梨醫生

Admission --Name Table 
Adm_ID --Number of the reception 
Pat_ID --Id Patient 
Date_Adm --Date reception 
Date_Discharge --Discharge Date from the hospital 
Health_ID --Health at the moment of discharge 


Adm_Med --Name Table 
Adm_ID 
Med_ID --ID Medical Procedure carried out 
Doc_ID --ID Doctor who carried that out. 

我想製作一張表格,顯示每位醫生每年的成功醫療護理數量。成功的醫療照顧是Health_ID =20定義(20Healthy代碼)

我嘗試:

有接診醫生從1996年到2001年。爲了方便我開始只有兩年:1996年和1997年。首先,我創建了兩個獨立的表:一個給人成功的關注人數於1996年,另一個是1997年。例如,對於1996年:

SELECT Doc_ID, COUNT(aID) as [Successful 1996] 
    FROM 
    (
     SELECT a.Adm_ID as aID, Doc_ID, YEAR(Date_Discharge) as yr, Health_ID 
     FROM Admission a, Adm_Med am 
     WHERE a.Adm_ID=am.Adm_ID 
     AND year(date_discharge)=1996 
     AND Health_ID=20 
    ) temp2 
    GROUP BY Doc_ID 

而且兩個獨立的表的結果:

enter image description here

然後我試圖加入他們的行列:

SELECT T1.Doc_ID, [Successful 1996], [Successful 1997] 
FROM 
(
    SELECT Doc_ID, COUNT(aID) as [Successful 1996] 
    FROM 
    (
     SELECT a.Adm_ID as aID, Doc_ID, YEAR(Date_Discharge) as yr, Health_ID 
     FROM Admission a, Adm_Med am 
     WHERE a.Adm_ID=am.Adm_ID 
     AND year(date_discharge)=1996 
     AND Health_ID=20 
    ) temp2 
    GROUP BY Doc_ID 
) T1 

FULL OUTER JOIN 

(
    SELECT Doc_ID, COUNT(aID) as [Successful 1997] 
    FROM 
    (
     SELECT a.Adm_ID as aID, Doc_ID, YEAR(Date_Discharge) as yr, Health_ID 
     FROM Admission a, Adm_Med am 
     WHERE a.Adm_ID=am.Adm_ID 
     AND year(date_discharge)=1997 
     AND Health_ID=20 
    ) temp2 
    GROUP BY Doc_ID 

) T2 
ON T1.Doc_ID=T2.Doc_ID 

並給出

enter image description here

。可以看到,七號線給出了一個成功的醫療ATT。在1997,但NULL Doc_ID該行,當它應該是Doc_ID與編號82

我認爲FULL OUTER JOIN存在問題,但作爲初學者,我無法弄清楚爲什麼會發生這種情況以及如何解決問題。

+0

你從T1得到DOC_ID和T1表沒有DOC_ID = 82 – Ali7091

回答

2

顯示的最左邊一列來自T1.Doc_ID。但是,你的子查詢T1沒有爲那些在1996年

沒有入場醫生

更改您的查詢這種方式返回一行:

SELECT coalesce(T1.Doc_ID, T2.Doc_ID), [Successful 1996], [Successful 1997] 
... 

這樣,醫生的ID號是從T1或T2採取基於在哪裏它不是空的。

+0

雖然它解決您的問題@NineBerry解決方案是更好的方式表現明智,並且不需要額外的查詢和參加每年,只是增加柱。 –

+0

P.s.和@GordonLinoff會說:**「學習使用正確的JOIN語法。簡單的規則:永遠不要在FROM子句中使用逗號。」** –

1

由於您打算爲很多不同年份創建大量列,因此每年使用子查詢並加入它們可能不是一個好主意。相反,你可以使用一個查詢和過濾/創建不同列中的選擇條款本身在計算這樣的:

SELECT Doc_ID, 
    Sum(CASE WHEN year(date_discharge)=1996 THEN 1 ELSE 0 END) as [Successful 1996], 
    Sum(CASE WHEN year(date_discharge)=1997 THEN 1 ELSE 0 END) as [Successful 1997], 
    Sum(CASE WHEN year(date_discharge)=1998 THEN 1 ELSE 0 END) as [Successful 1998] 
    -- And so forth 
    FROM Admission a, Adm_Med am 
    WHERE a.Adm_ID=am.Adm_ID 
    AND Health_ID=20 

GROUP BY Doc_ID 

(代碼未測試)

+0

哇!你用這個釘在頭上。一旦看到你的第一個答案,並回到我的代碼,我意識到每年重複查詢會有什麼讓人頭痛的問題。這阻止了我這樣做。我會更多地閱讀「CASE」聲明。我不知道這件事。謝謝! – Jazz

1

我強烈建議你使用聚合此。 NineBerrys的做法是相當接近,但我會寫這樣的:

SELECT ad.Doc_ID, 
      SUM(CASE WHEN year(a.date_discharge) = 1996 THEN 1 ELSE 0 END) as Successful_1996, 
      SUM(CASE WHEN year(a.date_discharge) = 1997 THEN 1 ELSE 0 END) as Successful_1997, 
      SUM(CASE WHEN year(a.date_discharge) = 1998 THEN 1 ELSE 0 END) as Successful_1998, 
      . . . 
    FROM Adm_Med am LEFT JOIN 
     Admission a, 
     ON a.Adm_ID = am.Adm_ID AND a.Health_ID = 20 
    GROUP BY am.Doc_ID; 

我要指出,這是假定(一樣原始查詢)認爲,醫生只做每一個入場手續。或者,用不同的方式來描述,這是計算程序,而不是招生或患者。

有什麼區別?

  • 有包括合格列名稱的外觀變化。
  • 更重要的是,它在ON子句中使用了具有健康狀況的LEFT JOIN。這可確保您獲得0計數的醫生。