微软访问中的聚合函数

时间:2014-11-22 15:47:18

标签: ms-access

我有一张表格如下:

userid  checktime                checktype
------------------------------------------
213     10/30/2014 2:06:09 PM    O
592     10/30/2014 2:28:04 PM    I
714     10/30/2014 10:02:59 AM   O
714     10/30/2014 10:03:01 AM   O
147     10/30/2014 1:05:15 PM    O
147     10/30/2014 1:05:20 PM    I
147     10/30/2014 1:13:17 PM    O
147     10/30/2014 1:13:23 PM    I
213     10/30/2014 11:56:11 AM   I
147     10/30/2014 1:08:26 PM    O
147     10/30/2014 1:08:32 PM    I

如何选择记录格式为' I'的用户?只有或者是'' O'只,而不是两者兼而有之?我希望查询与Microsoft Access兼容。

2 个答案:

答案 0 :(得分:1)

首先创建一个查询,为 userid checktype 的每个组合返回一行:

SELECT DISTINCT h.userid, h.checktype
FROM tblHani AS h
WHERE (((h.checktype) In ('I','O')));

注意 checktype 是否只能是所有行中的 I O (无空值,零长度字符串或其他值) ,不需要WHERE条款。

然后,您可以将其用作另一个子查询源,为每个 userid 计算 checktype 值,并仅保留计数为1的那些:

SELECT sub.userid, Count(sub.checktype) AS CountOfchecktype
FROM
    (
        SELECT DISTINCT h.userid, h.checktype
        FROM tblHani AS h
        WHERE (((h.checktype) In ('I','O')))
    ) AS sub
GROUP BY sub.userid
HAVING (((Count(sub.checktype))=1));

将示例数据放在名为 tblHani 的表中,这是我在Access 2010中获得的输出:

userid CountOfchecktype
------ ----------------
   592                1
   714                1

答案 1 :(得分:0)

您可以使用以下事实:布尔值TRUE表示为-1,布尔值FALSE表示为0.因此,您可以计算类型=“I”为真的次数以及type =“O”的次数为真。 按用户ID分组并仅显示不相等的人:

SELECT User, Sum([type]="i") AS ins, Sum([type]="o") AS outs, Abs(Sum([type]="i")-Sum([type]="o")) AS diff
FROM myTable
GROUP BY User
HAVING (((Abs(Sum([type]="i")-Sum([type]="o")))>0));