小弟 初来乍到,没有分,那位前辈指点下,万分感激!
我想根据一个打卡系统得出当月所有人打卡的明细表:
我现在完成的语句只能实现某一天的查询如下:                                      
        上午  下午                                  
张三     √     △    
李四     √     △    
王五     √     △    
我需要得到的表格是这样:
         X年X月X日    X年X月X+1日
        上午  下午    上午   下午
张三     √     △      √    √
李四     √     △      √    √
王五     √     △      √    △我写的语句如下:
select distinct a.user_id,a.user_name,
(select  case when to_char(b.onduty_time,'hh24:mi')<='09:00' then '√' 
else '△' end  from punch_card_record b where b.user_id=a.user_id and b.record_date = to_date('2009-03-08','yyyy-mm-dd' )) 上午,
(select  case when to_char(b.onduty_time,'hh24:mi')>='17:20' then '√' 
else '△' end  from punch_card_record b where b.user_id=a.user_id and b.record_date = to_date('2009-03-08','yyyy-mm-dd' )) 下午
from punch_card_record a

解决方案 »

  1.   

    建议使用个存储过程,用一条语句写出一个月的,一方面确实不太好写,另一方面可读性也较差。可以参考Sql Server帮助文档的交叉表查询部分。祝你好运!
      

  2.   

    我现在的做法是写了1-31条语句放在一起,
    我想知道可不可以直接根据一个给定的时间让他循环递增的查询31或者30次。select distinct a.user_id,a.user_name,
    ((select  case when to_char(b.onduty_time,'hh24:mi')<='09:00' then '√'
     else to_char(b.onduty_time,'hh24:mi') end  from punch_card_record b where b.user_id=a.user_id 
     and b.record_date = to_date('2009-03-01','yyyy-mm-dd' ))||','||
    (select  case when b.offduty_time is null then '×'
     when to_char(b.offduty_time,'hh24:mi')>='17:20' then '√' 
     when to_char(b.offduty_time,'hh24:mi')<='17:20' then to_char(b.offduty_time,'hh24:mi') 
     end  from punch_card_record b where b.user_id=a.user_id 
     and b.record_date = to_date('2009-03-01','yyyy-mm-dd' )) ) "1"from punch_card_record aSQL的高手门谁告诉我下呀。 万分感激!