【问题标题】:Access 2007: "SELECT COUNT(DISTINCT ..."访问 2007:“SELECT COUNT(DISTINCT ...”
【发布时间】:2009-08-25 20:06:10
【问题描述】:

我有一个包含 StudyId、PatientId 和 StudyStartDateTime 的表。我想绘制用户指定的两个日期之间的研究和患者总数。问题在于计算不同的值。这是查询:

SELECT
    s.StudyStartDateTime,
    COUNT(s.StudyId),
    COUNT(s.PatientId)
FROM
    dbo_Study_ViewX211_Rpt AS s
WHERE
    s.StudyStartDateTime>=Forms![StudiesPatientsByDate]!txtStartDate,
    s.StudyStartDateTime<=Forms![StudiesPatientsByDate]!txtEndDate
GROUP BY s.StudyStartDateTime
ORDER BY s.StudyStartDateTime;

此查询几乎可以正常工作,只是它计算具有相同 StudyId 或相同 PatientId 的行的重复项。我知道 Access 不支持 COUNT(DISTINCT...),但我在解决这个问题时遇到了很多麻烦。任何帮助将不胜感激。

【问题讨论】:

  • 问题:数据是存储在 JET 表中还是传递给 SQL(打开更多选项)?
  • 数据最初存储在SQL Server 2005中。出于开发目的,我已经将数据转储并导入到Access中。理想情况下,我认为无论数据源是服务器还是导入 Access 的转储,Access 接口都可以工作。

标签: sql database ms-access


【解决方案1】:

您可以尝试使用计数的子查询来执行此操作,但在性能方面,相关的子查询往往会受到影响。

如果您愿意在两个查询而不是一个查询中执行此操作,那么这些将起作用:

SELECT
    s.StudyStartDateTime,
    COUNT(s.PatientId)
FROM
    dbo_Study_ViewX211_Rpt AS s
WHERE
    s.StudyStartDateTime>=Forms![StudiesPatientsByDate]!txtStartDate,
    s.StudyStartDateTime<=Forms![StudiesPatientsByDate]!txtEndDate
GROUP BY s.StudyStartDateTime, s.PatientId
ORDER BY s.StudyStartDateTime;


SELECT
    s.StudyStartDateTime,
    COUNT(s.StudyId),
FROM
    dbo_Study_ViewX211_Rpt AS s
WHERE
    s.StudyStartDateTime>=Forms![StudiesPatientsByDate]!txtStartDate,
    s.StudyStartDateTime<=Forms![StudiesPatientsByDate]!txtEndDate
GROUP BY s.StudyStartDateTime, s.StudyId
ORDER BY s.StudyStartDateTime;

请注意,我将计数字段添加到每个表达式的 GROUP BY 中。

如果您想让它更“紧凑”,您可以为这些查询中的每一个创建一个视图,并将它们加入到 StudyStartDateTime 上的不同查询中,以便在一个结果集中获得所有结果。

【讨论】:

  • 但这如何计算不同的行数?
  • 不同的行?您的问题要求 PatiendID 和 StudyID 中的不同值。不同的行是另一个问题。
【解决方案2】:

注意到 dbo_ 前缀 - 这是否链接到 SQL Server 数据库?

如果是这样,您可以使用传递查询并使用 COUNT(DISTINCT ...) 语法,因为它将直接传递给 SQL Server。

【讨论】:

  • 是的,但不幸的是,它也需要在仅访问副本上工作。
【解决方案3】:

将此放在单独的答案中,以便可以独立投票,但这篇博客文章讨论了使用子查询方法来做到这一点:

Writing a Count(Distinct) Query in Access

【讨论】:

  • 这也是我找到的第一篇文章。到目前为止,我一直无法采用这种方法。我认为问题出在这样一个事实,即虽然他只有一个必须区分的值,但我有两个。
  • 补充我之前的评论,问题是因为他只有一列需要区分,他不必担心将这两个加入单独的 SELECT DISTINCT 查询。
  • 诀窍是加入两个派生表(子查询)而不是一个。每个计数一个(基本上是我在另一个答案中提出的两个查询)
【解决方案4】:

我采纳了 JohnFx 的建议,并创建了这两个子查询:

numStudiesByDate:

SELECT
    t.StudyStartDateTime,
    COUNT(s.StudyId) AS numStudies
FROM
    (SELECT DISTINCT
        StudyId
    FROM
        dbo_Study_ViewX211_Rpt
    GROUP BY StudyId) AS s
INNER JOIN
    dbo_Study_ViewX211_Rpt AS t
ON t.StudyId=s.StudyId
WHERE
    t.StudyStartDateTime>=Forms![StudiesPatientsByDate]!txtStartDate,
    t.StudyStartDateTime<=Forms![StudiesPatientsByDate]!txtEndDate
GROUP BY t.StudyStartDateTime
ORDER BY t.StudyStartDateTime;

numPatientsByDate:

SELECT
    t.StudyStartDateTime,
    COUNT(s.PatientId) AS numPatients
FROM
    (SELECT DISTINCT
        PatientId
    FROM
        dbo_Study_ViewX211_Rpt
    GROUP BY PatientId) AS s
INNER JOIN
    dbo_Study_ViewX211_Rpt AS t
ON t.PatientId=s.PatientId
WHERE
    t.StudyStartDateTime>=Forms![StudiesPatientsByDate]!txtStartDate,
    t.StudyStartDateTime<=Forms![StudiesPatientsByDate]!txtEndDate
GROUP BY t.StudyStartDateTime
ORDER BY t.StudyStartDateTime;

最后的查询:

numStudiesPatientsByDate:

SELECT
    s.StudyStartDateTime,
    s.numStudies,
    p.numPatients
FROM
    numStudiesByDate AS s
INNER JOIN
    numPatientsByDate AS p
ON
    s.StudyStartDateTime = p.StudyStartDateTime;

感谢所有帮助,希望其他人觉得这很有用!

【讨论】:

  • 即使你改变了他的建议,你不应该把答案归功于他吗?
猜你喜欢
  • 2015-01-28
  • 1970-01-01
  • 2017-12-19
  • 2016-01-27
  • 1970-01-01
  • 2012-05-10
  • 2023-03-15
  • 2012-10-13
  • 1970-01-01
相关资源
最近更新 更多