一个多列转一列多行的有关问题

求助一个多列转一列多行的问题!
现在有一些类似以下的数据:
       PERSONNUM      EVENTDATE   INPUNCH                       OUTPUNCH
E4103                 2015/1/16    2015/1/16 19:52:00
E4103              2015/1/16                                     2015/1/17 8:00:00
E4103                 2015/1/16         2015/1/15 23:37:00
E4103                 2015/1/16                                      2015/1/16 8:01:00
我想把它们变成一下数据:
  PERSONNUM      EVENTDATE       TIME
E4103                 2015/1/16    2015/1/16 19:52:00
E4103              2015/1/16    2015/1/17 8:00:00
E4103                 2015/1/16         2015/1/15 23:37:00
E4103                 2015/1/16     2015/1/16 8:01:00


如果有少于四行,或者多余四行的情况也按这样处理,该如何实现呢,拜托各位~


------解决思路----------------------
有个很简单的方法,使用union
SELECT PERSONNUM, EVENTDATE, INPUNCH TIME
  FROM TABLE_NAME
 WHERE INPUNCH IS NOT NULL
UNION ALL
SELECT PERSONNUM, EVENTDATE, OUTPUNCH TIME
  FROM TABLE_NAME
 WHERE OUTPUNCH IS NOT NULL;

------解决思路----------------------
只有两列合并使用nvl函数即可,如果有很多列需要合并可以考虑使用coalesce函数