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中有别的函数能代替吗?