Access交流中心

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

查询请教

chinasa  发表于:2015-05-04 09:31:41  
复制

我有一张请假表,记录了姓名、请假类型、开始日期、结束日期、开始时间、结束时间,我现在需要把相同姓名的连续假期(无论是病假还是事假)整理到一条记录上,比如:

 

张三的假期有三条,分别是 1)5月12日8点到12点 2)5月12日12点到17点半 3)5月13人8点到14日17点半,我需要把这三条记录整理成:张三、休假、5月12日8点到17日17点半。

 

说明:请假时间的开始与结束只有 8点、12点、17点半三个时间节点,比如上例的12日17点半与13日的8点可以认为是连续的,因为中间的是晚上非工作时间。

 

tb1
XM LX ksRQ jsRQ ksSJ jsSJ
张三 病假 2015-5-12 2015-5-12 8:00 12:00
李四 病假 2015-5-12 2015-5-12 8:00 12:00
张三 事假 2015-5-12 2015-5-12 12:00 17:30
王二 事假 2015-5-12 2015-5-13 8:00 17:30
麻五 事假 2015-5-12 2015-5-12 12:00 17:30
张三 病假 2015-5-13 2015-5-14 8:00 17:30

 

�������ش˸���

 

 

Top
煮江品茶 发表于:2015-05-04 10:00:26

收尾衔接不就完事了嘛。


SELECT a.XM, a.LX, a.ksRQ, b.jsRQ, a.ksSJ, b.jsSJ

FROM tb1 AS a 
INNER JOIN tb1 AS b 
ON (Cdate(a.jsRQ & " " & a.jsSJ)=Cdate(b.ksRQ & " " & b.ksSJ)) AND (a.XM=b.XM);


chinasa 发表于:2015-05-04 10:38:30

煮版您好,还不能直接进行首尾衔接,为了说明问题,我把张三的请假时间进行了修改,修改后张三13日12点到14日17点半休假,这样张三13日上午需要工作就不连续了。

我需要张三如下显示
张三  2015-5-12 8:00    2015-05-12 17:30

张三  2015-5-13 12:00   2015-5-14 17:30

李四

王二

.......

 

 

tb1
XM LX ksRQ jsRQ ksSJ jsSJ
李四 病假 2015-5-12 2015-5-12 8:00 12:00
麻五 事假 2015-5-12 2015-5-12 12:00 17:30
王二 事假 2015-5-12 2015-5-13 8:00 17:30
张三 病假 2015-5-13 2015-5-14 12:00 17:30
张三 事假 2015-5-12 2015-5-12 12:00 17:30
张三 病假 2015-5-12 2015-5-12 8:00 12:00


煮江品茶 发表于:2015-05-04 10:54:01

鬼打架。

最后一条记录与倒数第二条记录是收尾相接,倒数第二条记录与倒数第三条记录不相接。这与我写的查询是一致的嘛。

你试试我写的查询,不就知道是不是对的了吗?


另外可以把a.LX改为:"休假" as LX





chinasa 发表于:2015-05-04 11:07:52

不好意思,确实您是对的。

请教下,如何能把所有数据都显示出来,目前只显示了满足ON后面条件的记录,我需要把所有记录都显示出来。  我用 left join代替INNER JOIN记录有了,但有两个字段数据为空。



煮江品茶 发表于:2015-05-04 11:14:06

这可能比较复杂,我想想给你答复。




煮江品茶 发表于:2015-05-04 11:50:15

写两个查询吧,这样可读性强些。


查询1:

SELECT a.XM, "休假" as LX, a.ksRQ, b.jsRQ, a.ksSJ, b.jsSJ
FROM tb1 AS a 
INNER JOIN tb1 AS b 
ON (Cdate(a.jsRQ & " " & a.jsSJ)=Cdate(b.ksRQ & " " & b.ksSJ)) AND (a.XM=b.XM);

查询2:
SELECT *
FROM tb1
WHERE ((([XM] & [ksRQ] & [ksSJ]) Not In (select XM & ksRQ & ksSJ from 查询1)) AND (([XM] & [jsRQ] & [jsSJ]) Not In (select XM & jsRQ & jsSJ from 查询1)))
UNION ALL SELECT *
FROM 查询1
ORDER BY ksRQ, ksSJ;


chinasa 发表于:2015-05-04 12:00:06
 查询2用到“tb1查询”, 这个查询是什么内容?


煮江品茶 发表于:2015-05-04 12:00:45

不是tb1查询,改成查询1.

另外:

这个问题更复杂的是,前一次请假结束为下班时间,后一次请假的开始时间为第二天的上班时间,这实际上是连续的,但处理起来会非常困难。

遇到这样的困难时,有一个简化的方法。那就是在客户端进行校验,当查到符合上述情况时,强行将下次的开始时间变成上一次的结束时间,也就是说这样的情况不能输入本日的8:00:00,而必须输入前一天的17:30:00。这样就可以简化查询的编写了。



chinasa 发表于:2015-05-04 13:02:11

万分感谢您的指点,已经很好了。

再次感谢!



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