2017-03-08 32 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