access中 如何代替 distinct

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了access中 如何代替 distinct相关的知识,希望对你有一定的参考价值。

使用access,distinct函数就没有声明的, 怎么解决这个办法

参考技术A (1) Swithch函数是必需是两两参数出现的,那个最先为真(True)就取那个值.如
Switch(表达式,值,表达式2,值2,表达式3,值3,....,表达式n,值n)

所以y=Switch(x>0,1,x=0,0,x<0,-1)

中,若是X>0为真,就取值为1,余下的就不会计算了,而若X>0为假就是X不大于零,那就计算下一对中的表达式X=0,若对就取值0,或还是不对,那就再计算下一对参数中的表达式,若此表达式值为True就取值-1,若不为True,那就是全部都为假(False),那Switch函数就会返回为null

(2)Choose在英文上是选择的意思,在这里也一样,此函数先计算第一个参数的值,然后根据这个值选择余下的参数.所以像Switch一样可以有很多个函数.

在y=Choose(x,5,m+1,n)中,若x的值是1就返为第二个参数的值5,若x的值是2就返回第三个参数m+1的值,若x的值为3就返回第四个参数n的值.

注意:若第一个参的值小于 1 或大于列出的选择项数目时,Choose 函数返回 Null.

(3)当一个 Variant 为 Null 时,使用 Nz 函数可以返回 0、零长度字符串 (" ") 或其他指定值。

例如,表达式 2 + varX 在 Variant varX 为 Null 时总是返回 Null 值。而 2 + Nz(varX) 却返回 2

Nz 函数对可能包含 Null 值的表达式是很有用的。要使表达式即使在包含 Null 值时也能计算得到一个非 Null 值,可使用 Nz 函数来返回 0、零长度字符串或一个自定义的返回值。
参考技术B distinct 有 但是 不能这样用
select count(distinct id) from table本回答被提问者采纳

Access 2007:“SELECT COUNT(DISTINCT ......”)

我有一个包含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 ...),但是我在解决这个问题上遇到了很多麻烦。任何帮助将非常感激。

答案

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

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

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上的一个独特查询,以便在一个结果集中获得结果。

另一答案

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

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

另一答案

将它放在一个单独的答案中,以便可以独立投票,但这篇博客文章讨论了使用子查询方法执行此操作:

Writing a Count(Distinct) Query in Access

另一答案

我已经采纳了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;

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

以上是关于access中 如何代替 distinct的主要内容,如果未能解决你的问题,请参考以下文章

oracle decode 在access中有别的函数能代替吗?

我可以在后端使用 MS-Access 而不是 MYSQL

DBhelper

在rhel8中不存在xclock,请使用xterm代替xclock

如何在android中插入%20代替空格

如何在 Access 2010 中使用 .mdw 文件