我有一个表格,其中包含项目列表,优先级(分为2类优先级)及其状态。该表包含以下字段:
我需要有一个针对每个状态的摘要,我想知道优先级为cat A>的项目数量。 0和优先级为cat B的项目数> 0。 在Structure视图中构建查询,结果SQL代码是:
SELECT MyTable.Status, Count(MyTable.[Priority CatA]) AS [CountCatA], Count(MyTable.[Priority CatB]) AS [CountCatB]
FROM MyTable
GROUP BY MyTable.Status
HAVING (((Count(MyTable.[Priority CatA]))>0) AND ((Count(MyTable.[Priority CatB]))>0));
此查询的结果不是我想要的,它也计算优先级= 0。 所以我尝试用这种方式修改HAVING语句中的SQL语句:
HAVING (((MyTable.[Priority CatA])>0) AND ((MyTable.[Priority CatB])>0));
但结果并不好,给出了以下错误:
"您尝试执行不包含指定表达式作为聚合函数一部分的查询。 (错误3122)"
有人能帮助我吗?
谢谢。
答案 0 :(得分:0)
首先,使用WHERE子句在聚合发生之前限制结果。 HAVING
会在聚合后过滤结果。使用SQL了解这一点非常重要。
此外,使用>0
函数检查每个字段的查询的SELECT部分内的iif()
。像下面这样的东西会让你接近:
SELECT status, sum(iif([priority catA]>0, 1, 0)) as [CountCatA], sum(iif([priority catB]>0, 1, 0)) as [CountCatB]
FROM MyTable
GROUP BY status;
这两个计算字段正在检查每个相应的priority cat
是否大于0
,如果是,则返回1
。然后将1
求和,并在status
上进行分组。
答案 1 :(得分:0)
我认为你想要条件聚合:
SELECT MyTable.Status,
SUM(IIF([Priority CatA] > 0, 1, 0)) as CountCatA,
SUM(IIF([Priority CatB] > 0, 1, 0)) as CountCatB
FROM MyTable
GROUP BY MyTable.Status;