2017-03-08 31 views
-1

我有一個很好的查詢(列在下面)。我遇到的問題是我們遇到了一個病人,這個病人在兩個不同的日子裏有過活動,並且因爲我正在按PATNUM分組,所以它只顯示爲一個。在sql和group中使用count個不同的case多列

我怎樣才能得到它每次向計數1,如果PATNUMSCHDT不同

例子:

 PATNUM SCHDT 
     12345  30817 
     12345  30817 
     54321  30817 
     54321  30717 

PATNUM 12345PATNUM 54321應計兩次應該只算一次。

我count語句是這樣的:

SELECT ph.*, pi.*, 
COUNT(DISTINCT CASE WHEN `SERVTYPE` IN ('INPT','INPFOP','INFOBS','IP') AND Complete ='7' THEN pi.PATNUM ELSE NULL END) AS count1, 
COUNT(DISTINCT CASE WHEN `SERVTYPE` IN ('INPT','INPFOP','INFOBS','IP') AND Complete ='8' THEN pi.PATNUM ELSE NULL END) AS count2 
FROM patientinfo as pi 
INNER JOIN physicians as ph ON pi.SURGEON=ph.PName 
WHERE PID NOT IN ('1355','988','767','1289','484','2784') 
GROUP BY SURGEON 
ORDER BY Dept,SURGEON ASC 
+0

在大多數企業SQL引擎中,這會引發錯誤。您應該將所有不屬於聚合函數的字段分組。這必須是mySQL或某種引擎,它通過語法支持非標準組。通過patnum和schdt添加到您的小組中,您可能會接近,但我仍然害怕patentinfo和醫生中未分組的其他數據。 – xQbert

回答

1

你要哪列看?

你可以調整你的GROUP BY:

SELECT 
ph.pname, 
ph.specialty, 
SUM(CASE WHEN complete = 7 THEN 1 ELSE 0 END) count1, 
SUM(CASE WHEN complete = 8 THEN 1 ELSE 0 END) count2 
FROM 
(
    SELECT 
    DISTINCT 
    surgeon, 
    patnum, 
    schdt, 
    complete, 
    servtype 
    FROM patientinfo 
    WHERE complete IN (7,8) 
    AND servtype IN ('INPT','INPFOP','INFOBS','IP') 
    AND pid NOT IN ('1355','988','767','1289','484','2784') 
) pisub 
INNER JOIN physicians ph ON pisub.surgeon = ph.pname 
GROUP BY ph.pname, ph.specialty 
ORDER BY ph.pname, ph.specialty; 

另外,我想提出幾點建議:

  • 如果你想給你的表的別名,然後使用別名時指的是你的查詢中的任何列。我在這裏猜測了一些關於他們來自哪個表(例如部門)的列,所以如果它不正確,請隨時更改它
  • 您不需要從兩個表中選擇所有記錄如果您不需要它們
  • 如果您未選擇GROUP BY所有列,查詢將不會運行。 I've written about this一般爲Oracle和SQL,但實際上在MySQL中,我認爲它運行但顯示不正確的結果。
+0

mySQL(以及其他一些引擎)擴展了該組,以便從未分組的字段中選擇一個值。這是BY DESIGN的一個特徵,所以不是不正確的結果;人們只需要瞭解它的作用和原因。這與大多數企業級數據庫不同。 – xQbert

+0

如果按日期和外科醫生進行分組,每個日期和外科醫生會給出一條線,所以每個月對於每位外科醫生我都會有20條線。我正在爲每位外科醫生尋找一條線,顯示他們做了多少例。 我接受任何和所有的建議。 –

+0

如果你想每個外科醫生一行和病例數,那麼它將是GROUP BY的外科醫生,只顯示外科醫生。我會更新我的答案。 – bbrumm