在sql中使用Count distinct case,按多列使用group

时间:2017-03-08 21:11:01

标签: sql

我的查询效果很好(如下所示)。我遇到的问题是我们遇到了一个病人,这个病人在两个不同的日子里有过活动,因为我按PATNUM进行分组,只是将其显示为一个。

如果PATNUMSCHDT不同,我怎样才能让它每次计数

示例:

      PATNUM    SCHDT
      12345      30817
      12345      30817
      54321      30817
      54321      30717

PATNUM 12345只计算一次PATNUM 54321应计算两次。

我的计数陈述是这样的:

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 

1 个答案:

答案 0 :(得分: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;

另外,我会提出一些建议:

  • 如果您要为表提供别名,请在引用查询中的任何列时使用别名。我在这里猜测了一些关于它们来自哪个表的列(例如dept),如果不正确,请随意更改
  • 如果您不需要,您不需要从两个表中选择所有记录
  • 如果您没有对您选择的所有列进行分组,则查询将无法运行。对于Oracle和SQL来说I've written about this一般,但实际上在MySQL中我认为它确实运行但显示的结果不正确。