我有一张表格如下:
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兼容。
答案 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));