【问题标题】:Having clause being ignored有子句被忽略
【发布时间】:2015-11-05 20:59:29
【问题描述】:

在此查询中,我试图获得一个计数,以便在给定条件下为每次实践提供患者计数。

问题是我必须向患者展示过去一年中就诊次数 >=3 次的患者。

计数(D.PID)

在选择列表中忽略

拥有计数(admitdatetime)>=3

这是我的查询

select distinct D.PracticeAbbrevName, D.ProviderLastName, count(D.pid) AS Count

from PersonDetail AS D  
left join Visit AS V on D.PID = V.PID

where D.A1C >=7.5  and V.admitdatetime >= (getdate()-365) and D.A1CDays <180 and D.Diabetes = 1 

group by D.PracticeAbbrevName, D.ProviderLastName

having count(admitdatetime)>=3

order by PracticeAbbrevName 

如果我去掉 D.pid 的计数功能,只单独显示每个 PID,我的短语就可以正常工作。

count 和现在可以一起正常工作。

【问题讨论】:

  • 您不能使用group by 单独显示每个 PID。请显示您的结果以及不正确的原因。
  • 注意:COUNT(column)COUNT(DISTINCT column) 不同。 (同时使用 SELECT DISTINCTGROUP BY 几乎总是多余的,但不是导致您的问题的原因)
  • 当我单独显示每个 PID 时,我将 PID 添加到分组依据。例如,对于一个 providerlastname,COUNT 是 21,但是当我按单个 PID 选择时,有 2 个。当我删除单个 PID 的 having 语句时,它会转到 21 个唯一 PID
  • 谢谢@RBarryYoung 我实际上有 count(distinct d.pid) 但在尝试四处寻找解决方案时,我将它移到了上面显示的位置。正如你所说,这并不能解决问题

标签: sql sql-server count having


【解决方案1】:

修改后的答案:

SELECT DISTINCT
  D.PracticeAbbrevName,
  D.ProviderLastName,
  COUNT(D.pid) AS PIDCount,
  COUNT(admitdatetime) AS AdmitCount
FROM
  PersonDetail AS D
  LEFT JOIN Visit AS V
    ON D.PID = V.PID
WHERE
  D.A1C >= 7.5
  AND V.admitdatetime >= ( GETDATE() - 365 )
  AND D.A1CDays < 180
  AND D.Diabetes = 1
GROUP BY
  D.PracticeAbbrevName,
  D.ProviderLastName
HAVING
  COUNT(admitdatetime) >= 3
ORDER BY
  PracticeAbbrevName 

【讨论】:

  • 我很确定 having 可能匹配也可能不匹配 select,但我有一些不匹配的问题。
  • 这些都不正确。我想选择 PID 的计数,但我需要有一种方法来显示过去 365 天内承认日期时间 >=3 的 PID 计数。
【解决方案2】:

你试图一次做太多事情。将逻辑分为两步:

  1. 查询按PID 分组以过滤掉不符合您条件的患者。
  2. 按实践查询分组以获取患者人数。

您的查询将如下所示:

;with EligiblePatients as (
    select d.pid,
           d.PracticeAbbrevName,
           d.ProviderLastName
      from PersonDetail d
      left join Visit v
        on v.pid = d.pid
       and v.admitdatetime >= (getdate()-365)
     where d.A1C >= 7.5
       and d.A1CDays < 180
       and d.Diabetes = 1
     group by d.pid,
              d.PracticeAbbrevName,
              d.ProviderLastName
     having count(v.pid) >= 3
)
select PracticeAbbrevName,
       ProviderLastName,
       COUNT(*) as PatientCount
  from EligiblePatients
 group by PracticeAbbrevName,
          ProviderLastName
 order by PracticeAbbrevName

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-22
    • 2021-01-08
    • 2012-10-11
    • 1970-01-01
    相关资源
    最近更新 更多