不知道為什麼,老大說不要在SQL 裡面加CASE 條件上和運算式,但我在統計表裡面,用了很多條件判斷,還用到了很多運算,老大說,重做。我不明白為什麼。老大說是標准,不能改。暈倒
給個例子,大家看怎麼做
    比如說,要統計一年的按(部門,月份)的刷卡時數,一天包括(上班刷卡,下班刷卡),當然只在上班日才要刷卡了,中間休息不用刷卡,在數據庫有的資料是'24:00'這樣的時間格式,所以你必要把24:00轉換成第二天00:00,注意這裡只有時間,沒有日期的字符格式,還存在誇日的情況,要統計的刷卡時數包含了休息時間,所以要減掉。數據表裡的資料是每個人每天的刷卡資料。
按老大的意思,大家看要怎麼做

解决方案 »

  1.   

    還有要判斷的是上班打卡和下班打卡之間有沒有包含休息時間,沒有就不用減除休息時間了,注意休息時間也包含誇日的情況,也有24:00情況      //得出應上班時間 ,包括了休息時間  (分鐘)
          check06=' case when day_id_check06=''Y'' then datediff(Minute,(case when day_id_check07=''24:00'' then dateadd(Minute,1,''23:59'') else day_id_check07  end),'
             +'(case when day_id_check08=''24:00'' then dateadd(Minute,1,''23:59'')  else (case when day_id_check07>day_id_check08 then dateadd(day,1,day_id_check08) else day_id_check08 end) end)) else 0 end ';
          //得出午休時間(分鐘)
          check11=' case when day_id_check11=''Y'' then dateDiff(Minute,(case when day_id_check12=''24:00'' then dateadd(Minute,1,''23:59'') else day_id_check12 end),'
             +'(case when  day_id_check13=''24:00'' then dateadd(Minute,1,''23:59'') else '
             +'  (case when day_id_check12>day_id_check13 then dateadd(day,1,day_id_check13) else day_id_check13 end) end)) else 0 end ';
          //得出晚休時間(分鐘)
          check14=' case when day_id_check14=''Y'' then dateDiff(Minute,(case when day_id_check15=''24:00'' then dateadd(Minute,1,''23:59'') else day_id_check15 end),'
             +'(case when  day_id_check16=''24:00'' then dateadd(Minute,1,''23:59'') else '
             +'  (case when day_id_check15>day_id_check16 then dateadd(day,1,day_id_check16) else day_id_check16 end) end)) else 0 end ';
          //確認上班時間 包括了休息時間  (分鐘)
          check19=' DateDiff(Minute,day_id_check20,day_id_check21) ' ;
          //判斷有沒有算午休時間,   針對實上班時數
          yes_check11 = ' (case when day_id_check11=''Y'' then '
                      +     '(case when day_id_check20 < '
                      +         '(case when day_id_check12<day_id_check07 then '
                      +             ' dateadd(day,1,convert(char(10),day_id_check02)+'' ''+day_id_check12)'
                      +         ' else convert(char(10),day_id_check02)+'' ''+ day_id_check12 end )'
                      +     ' and  day_id_check21 > '
                      +         '(case when day_id_check13<day_id_check07 then '
                      +             ' dateadd(day,1,convert(char(10),day_id_check02)+'' ''+day_id_check13)'
                      +         ' else convert(char(10),day_id_check02)+'' ''+day_id_check13 end )'
                      +      ' then 1 else 0 end)'
                      + ' else 0 end)';
          //判斷有沒有算晚休時間,   針對實上班時數
          yes_check14 = ' (case when day_id_check14=''Y'' then '
                      +     '(case when day_id_check20 < '
                      +         '(case when day_id_check15<day_id_check07 then '
                      +             ' dateadd(day,1,convert(char(10),day_id_check02)+'' ''+day_id_check15)'
                      +         ' else convert(char(10),day_id_check02)+'' ''+ day_id_check15 end )'
                      +     ' and  day_id_check21 > '
                      +         '(case when day_id_check16<day_id_check07 then '
                      +             ' dateadd(day,1,convert(char(10),day_id_check02)+'' ''+day_id_check16)'
                      +         ' else convert(char(10),day_id_check02)+'' ''+day_id_check16 end )'
                      +      ' then 1 else 0 end)'
                      + ' else 0 end)';
          //實上班時數 =確認刷卡時數 - 午休時間 - 晚休時間  因為精確到0.5
          SSB ='( '+check19+'-(case when '+yes_check11+'=1 then '+ check11+' else 0 end) - (case when '+yes_check14+'=1 then '+check14+' else 0 end)'+')/60+ '
                +     '(case when ( '+check19+'- (case when '+yes_check11+'=1 then '+ check11+' else 0 end) - (case when '+yes_check14+'=1 then '+check14+' else 0 end))'
                +          '%60>=30 then 0.5 else 0 end)';
      

  2.   

    觉得Case 比if else 效率要高一点`~`我也喜欢用CASE
      

  3.   

    看你的表咋个设计的。并不需要那么复杂的判断语句
    如果有部门。月份。时间这三个字段
    那么你用分类汇总就得到想要的。
    select 部门,月份 count(*) as 次数 from 表 group 部门,月份
      

  4.   

    如果你使用的是oracle数据库的话
    我觉得还是DECODE函数比较好用
    而且可以使SQL语句简洁
    你老大的话也可能是他的经验之谈
    毕竟他的经验要多一些.
      

  5.   

    你的这种东西最好不要用CASE,主要是因为效率问题1、你的是考勤记录,这个表一年下来数据量相当的庞大
    2、通过CASE实际上是至少多了一次运算,这当数据量大的时候是很恐怖的3、其实你的问题本来很简单
       A. 根本就没有24:00这个东西,23:59:59后的一秒是0:00:00,所以在做考勤原始记录的时候就应该把这个时间删除,这个时间一般是考勤机特殊的标记
       B. 你应该加入日期字段,或者用日期时间字段代替你的这个字段,这个是基本的东西,因为一个人一天的考勤可能会跨3天,尤其是当加班的时候
      

  6.   

    数据库重设计!呵呵!
    同意Hank(星星农场)
      

  7.   

    另外,case在数据库移植时会有问题(不是所有的数据库都支持case的)
      

  8.   

    THK 現在明白為什麼了
    1 為服務減擔
    2 為以後好維護