In pratica è una query che permette di "girare" le righe in colonne, ovvero partendo da una serie di dati come questi:
COGNOME     NOME         MATRICOLA   DATA          ORA
PAOLINO     PAPERINO     004276      20111114      1616
PAOLINO     PAPERINO     004276      20111116      746
PAOLINO     PAPERINO     004276      20111116      1312
PAOLINO     PAPERINO     004276      20111117      1621
PAOLINO     PAPERINO     004276      20111117      2036
PAOLINO     PAPERINO     004276      20111117      1714
DE PAPERIS  PICO         003744      20111114      1454
DE PAPERIS  PICO         003744      20111115      2031
DE PAPERIS  PICO         003744      20111115      1204
DE PAPERIS  PICO         003744      20111115      1537
DE PAPERIS  PICO         003744      20111117      2034
DE PAPERIS  PICO         003744      20111117      750
si arriva a questo risultato:
COGNOME     NOME          MATRICOLA    DATA        T1     T2     T3     T4 
PAOLINO     PAPERINO      004276       20111114    1616   
PAOLINO     PAPERINO      004276       20111116    746    1312   
PAOLINO     PAPERINO      004276       20111117    1621   1714   2036
DE PAPERIS  PICO          003744       20111114    1454
DE PAPERIS  PICO          003744       20111115    1204   1537   2031
DE PAPERIS  PICO          003744       20111117    750    2030
quindi una tabella dove per ogni matricola e giorno abbiamo delle colonne che indicano le timbrature di entrata o uscita (massimo 4 ordinate progressivamente)
La query per Oracle è:
select cognome, nome, matricola, data
    , max(decode(pos, 1, ora, 0)) as t1
    , max(decode(pos, 2, ora, 0)) as t2
    , max(decode(pos, 3, ora, 0)) as t3
    , max(decode(pos, 4, ora, 0)) as t4
from (
select cognome, nome, matricola, data,  ora
    ,row_number() over (partition by cognome, nome, matricola, data order by  ora) As pos 
 from  schema1.tabTimbrature
 where  data between '20111114' and '20111120'           
)  tmp 
group by cognome, nome, matricola, data
order by cognome, nome, matricola, data
il tutto lo si ottiene tramite la riga
row_number() over (partition by cognome, nome, matricola, data order by ora) As pos 
che mi permette di avere una colonna pos con un numero progressivo di riga per ogni gruppo composto da dipendente e data (funzione row_number in combinazione con over e partition). Sucessivamente tramite la funzione di raggruppamento max e la funzione decode creo le colonne (da t1 a t4).

Infatti la sub query interna ritorna questi dati:
COGNOME     NOME         MATRICOLA   DATA          ORA   POS
PAOLINO     PAPERINO     004276      20111114      1616   1
PAOLINO     PAPERINO     004276      20111116      746    1
PAOLINO     PAPERINO     004276      20111116      1312   2
PAOLINO     PAPERINO     004276      20111117      1621   1
PAOLINO     PAPERINO     004276      20111117      1714   2
PAOLINO     PAPERINO     004276      20111117      2036   3
DE PAPERIS  PICO         003744      20111114      1454   1
DE PAPERIS  PICO         003744      20111115      1204   1
DE PAPERIS  PICO         003744      20111115      1537   2
DE PAPERIS  PICO         003744      20111115      2031   3
DE PAPERIS  PICO         003744      20111117      750    1
DE PAPERIS  PICO         003744      20111117      2034   2
L'istruzione decode è simile alla case di T-SQL di MS SQL Server.
La funzione

decode(pos, 1, ora, 0)

corrisponde a

case pos when 1 then ora else 0 END