In pratica è una query per
Oracle in
PL/SQL 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). Successivamente 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