Access交流中心

北京 | 上海 | 天津 | 重庆 | 广州 | 深圳 | 珠海 | 汕头 | 佛山 | 中山 | 东莞 | 南京 | 苏州 | 无锡 | 常州 | 南通 | 扬州 | 徐州 | 杭州 | 温州 | 宁波 | 台州 | 福州 | 厦门 | 泉州 | 龙岩 | 合肥 | 芜湖 | 成都 | 遂宁 | 长沙 | 株洲 | 湘潭 | 武汉 | 南昌 | 济南 | 青岛 | 烟台 | 潍坊 | 淄博 | 济宁 | 太原 | 郑州 | 石家庄 | 保定 | 唐山 | 西安 | 大连 | 沈阳 | 长春 | 昆明 | 兰州 | 哈尔滨 | 佳木斯 | 南宁 | 桂林 | 海口 | 贵阳 | 西宁 | 乌鲁木齐 | 包头 |

如何查找不包含特定条件的记录!

蟹仔  发表于:2012-10-01 17:58:50  
复制

ID 姓名 行为 时间
1 张三 迟到 2012-9-14
2 张三 早退 2012-9-15
3 张三 迟到 2012-9-20
4 张三 迟到 2012-9-21
5 李四 迟到 2012-9-14
6 王五 旷工 2012-9-16
7 王五 迟到 2012-9-18
8 张三 请假 2012-9-30
9 李四 迟到 2012-9-30

 

请问如何得到从来没有犯某一特定行为的名单?例如我要查找从来没有早退过的员工。如何得出类似这样的查询?

姓名
李四
王五

 

Top
煮江品茶 发表于:2012-10-01 18:56:08
select DISTINCT 姓名 from tbname where dcount("*","tbname","姓名='" & 姓名 & "' and 行为='早退'")=0

煮江品茶 发表于:2012-10-01 19:06:43

如下两个语句也应该可以计算:

select distinct a.姓名 from tbname as a where (select count(b.*) from tbname as b where b.姓名=a.姓名 and b.行为="早退")=0

 

select 姓名 from tbname group by 姓名 having count(行为='早退')=0



蟹仔 发表于:2012-10-01 19:25:17

因为我的记录有几十万行,所以用聚合函数会慢得像死机。我想找一个不包含聚合函数的语句

select distinct * from a where not exists (select 姓名 from a where 行为="早退")
SELECT distinct * FROM a WHERE 姓名 Not In (SELECT 姓名 FROM b) 

以上这两种不包括聚合函数但查询出来依然很慢。因为如果数据有10万条。就会执行100亿次比对查询。



沈军 发表于:2012-10-01 23:10:41

做了一个查询,你可看看

 

SELECT 考勤表.姓名 FROM 考勤表 WHERE (((考勤表.行为)<>"早退" And (考勤表.行为)<>"迟到" And (考勤表.行为)<>"旷工" And (考勤表.行为)="请假")) GROUP BY 考勤表.姓名 ORDER BY 考勤表.姓名;

 

如果数据量太大,也可以指定 日期范围 进行一段时期的查询

 

SELECT 考勤表.姓名 FROM 考勤表 WHERE (((考勤表.行为)<>"早退" And (考勤表.行为)<>"迟到" And (考勤表.行为)<>"旷工" And (考勤表.行为)="请假") AND ((考勤表.时间)>=#开始日期# And (考勤表.时间)<=#结束日期#)) GROUP BY 考勤表.姓名 ORDER BY 考勤表.姓名;



蟹仔 发表于:2012-10-02 11:23:29

我已经找到办法了,先生成一个交叉表

TRANSFORM Last(A.时间) AS 时间之第一条记录
SELECT A.姓名
FROM A
GROUP BY A.姓名
PIVOT A.行为;

 

再建立一个条件为早退字段is null的条件查询就可以得出我想要的记录。

由于数据量实在太大了。一些看似简单的办法却无法执行。看来ACCESS还是不适合用于大量数据的处理。



心态哥 发表于:2012-10-02 15:42:17
路过。

煮江品茶 发表于:2012-10-02 19:34:08
交叉表都不是好办法。这是管理思路上的错误。正确的处理方法可参见:http://www.accessoft.com/article-show.asp?id=4773

总记录:7篇  页次:1/1 9 1 :