商铺号        签到时间  签退时间
C4-4026a
C4-4026b 08:28 17:35
c4-5001a
C4-5001B 08:17 17:07
c4-5005a         17:05
C4-5005b
c4-5007a
c4-5007b 07:49 17:19
c4-5011a 08:17 17:02
c4-5011b
C4-5013a
c4-5013b 08:22 17:08
数据是这样的,C4-4026a与C4-4026B表示一个商铺的2个店员,要求一个商铺至少一半以上的人打卡(如1个人就必须一个人打开,3个人必须2个人打卡),打卡可以一人打下班一人上班,但是必须保证加在一起是一半以上的人打卡,否则属于未打卡
求大神应该如何写SQL

解决方案 »

  1.   

    假设表结构为
    create table kaoqin(kid int auto_increment primary key,
        sp varchar(20) not null,    --------商铺号
        qdtime datetime,         ---------签到时间
        qttime datetime);  ------------签退时间
    有以下数据:执行以下sql语句
    select t.shangpu,if(sum(dk)/count(0)>=0.5,'一半以上的人打卡','未打卡')
    from 
    (select left(sp,7) as shangpu,ifnull((qdtime or qttime),0) as dk from kaoqin) as t 
    group by t.shangpu;
    得到结果:
      

  2.   

    大致上和crynono 的差不多
    不过你这如果一个人打了签到卡有打了签退卡是算两次打卡,还是一次,
    数据:如果是按两次打卡:SELECT a.spName,(CASE WHEN (SUM(a.qd) + SUM(a.qt))/(COUNT(1)*2) > 0.5 THEN '一半以上打卡' ELSE '未打卡' END) from 
    (SELECT LEFT(sp,7) as spName,(CASE WHEN qdtime is NULL THEN 0 ELSE 1 END) as qd, (CASE WHEN qttime is NULL THEN 0 ELSE 1 END) as qt
    from test1) a
    GROUP BY a.spName;如果按1次打卡:
    SELECT a.spName,(CASE WHEN SUM(a.qd)/COUNT(1) > 0.5 THEN '一半以上打卡' ELSE '未打卡' END) from 
    (SELECT LEFT(sp,7) as spName,(CASE WHEN qdtime is not NULL OR qttime is NOT NULL THEN 1 ELSE 0 END) as qd
    from test1) a
    GROUP BY a.spName;
    不过我这统计是按打卡次数算的,不知道有没有帮助