访问查询:计数值> 0

时间:2017-01-09 14:51:34

标签: sql ms-access count

我有一个表格,其中包含项目列表,优先级(分为2类优先级)及其状态。该表包含以下字段:

  • 项目名称
  • 状态
  • 优先类型A
  • 优先类型B

我需要有一个针对每个状态的摘要,我想知道优先级为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)"

有人能帮助我吗?

谢谢。

2 个答案:

答案 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;