Query per timbrature su Oracle
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:
si arriva a questo risultato:
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 è:
il tutto lo si ottiene tramite la riga
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:
Text
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
Text
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
La query per Oracle è:
PL/SQL
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
PL/SQL
row_number() over (partition by cognome, nome, matricola, data order by ora) As pos
Infatti la sub query interna ritorna questi dati:
Text
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
corrisponde a
La funzione
PL/SQL
decode(pos, 1, ora, 0)
T-SQL
case pos when 1 then ora else 0 END