sql行列转换(50分)

  • 主题发起人 ccweifen
  • 开始时间
C

ccweifen

Unregistered / Unconfirmed
GUEST, unregistred user!
表CardData
描述: 卡号 拉卡日期 拉卡时间
字段: CardNO CheckDate CheckTime
内容: 000001 2002-12-12 07:01
000001 2002-12-12 15:20 //正常情况下每天两条记录,但也有一天大于2条的情况
000002 2002-12-12 06:50
000002 2002-12-12 16:30
..................
现在客户想用IE查询显示如下结果:
CardNo Checkdate Checktime1 checktime2 //分别为第一次拉卡及最后一次拉卡
000001 2002-12-12 07:01 15:20
000002 2002-12-12 06:50 16:30
如果员工一天拉卡大于2条记录,则Checktime1为第一次拉卡时间,Checktime2为最后一次
拉卡时间 ,能直接用SQL语句实现吗?
 
select CardNo,Checkdate ,
(select min(checktime) from CardDate where cardNo=a.cardNo and checkDate=a.CheckDate) Checktime1,
(select Max(checktime) from CardDate where cardNo=a.cardNo and checkDate=a.CheckDate) Checktime1
from CardData a group by CardNo,Checkdate
 
Oracle吗?用Decode
 
select CardNo,Checkdate ,min(checktime) Checktime1,Max(checktime) Checktime2
from CardData
group by CardNo,Checkdate
 
谢谢jsxjd ,这语句正是我想要的
 
你最好是先将原始资料SELECT出,然后再用数组将同一个人同一天的资料合并成一笔资料!
这样做的好处是,SQL执行的时间会很少。而且能解决每人每天可以多次刷卡的问题。
 
Sorry Awen.ZW.Yang
给分时没有刷新网页,没看到你的回答,同样感谢!
 
你必须要考虑员工的异常刷卡(如奇数刷卡),只抓取min,max是不行的,你只是抓了员工上一个班的头尾刷卡时间,没有抓取中间的刷卡时间,如果遇到奇数次的刷卡,那么你抓出的资料就会出现错误。
如:1。员工刷一次卡:你抓出的min,max资料相同;
2。员工刷3次卡:这明显是不正常刷卡,但你只抓他的第一次和第三次。


 
我是给公司领导考勤,如果人事部门规定一天拉两次卡,那么中间的拉卡数据都应过滤掉
要不领导会不高兴的 :)
 
其实,一个好的系统并不只是她的程序写得好,很大原因是随之配套有一套完善的制度,如果
在推系统时,制度不合理那资讯人员会很累的,而且成功的把握会相对的变小。
SAP就是一个很好的例子。
 
:)
我们是公司下面一个信息部门,照领导的意愿统计出结果就行了,
写的系统是不往外推的,也不接外部市场的定单。
 
顶部