Principale utente con più risposte
Estrazione recursiva presenze

Domanda
-
Ho questo problema da cui non riesco ad uscire
Due tabelle, un di dipendenti e una di presenze (timbrature in azienda)
Dovrei ottenere un report in cui per ogni giorno presente nella tabella presenze abbia l'elendo dei dipendenti present e ASSENTI
Per i presenti ovviamente non ho problemi, ma non riesco ad ottenere i dipendenti assenti per ogni giorn. Lo riesco a fare per una data specifica, ma non ciclando sulle date della tabella presenze
Qualunque tipo di join provato non mi estrai gli assenti, io dovrei ottenere l'elenco delle date dalla tabella presenze e fare un ciclo per ogni data in ui verifico le assenze. Questa sarebbe la logica, ma dq sql non riesco a farlo
Gianni
Risposte
-
Ciao Gianni,
questa è una delle possibili soluzioni:
;with calendario as( select distinct convert(date, entrata) as giorno from dbo.presenze ), tabellone as( select cal.giorno, d.nominativo, d.matricola from calendario as cal cross join dbo.dipendenti as d ) select T.giorno ,T.nominativo ,iif(exists(select nominativo from dbo.presenze as P where convert(date, P.entrata)=T.giorno and P.matricola=T.matricola),'X','') as Presente ,iif(exists(select nominativo from dbo.presenze as P where convert(date, P.entrata)=T.giorno and P.matricola=T.matricola),'','X') as Assente from tabellone as T
order by 1,2
Ho ipotizzato che le due tabelle abbiano questa struttura:
create table dbo.dipendenti(matricola int not null identity primary key, nominativo nvarchar(128)); create table dbo.presenze(id int not null identity primary key, matricola int not null, entrata smalldatetime not null, uscita smalldatetime null); go create unique index uix_matricola on dbo.presenze(matricola, entrata); create unique index uix_entrata on dbo.presenze(entrata, matricola); go
La soluzione proposta non è ottimale in quanto non tiene conto:
- giorni in cui tutti sono assenti (il CTE "calendario" andrebbe sostituito con tabella dei giorni lavorativi dell'anno)
- turn-over: data assunzione e ritiro di ogni singolo dipendente (i ritirati e/o i non ancora assunti alla data risultano tra gli assenti
Giorgio
- Contrassegnato come risposta Edoardo BenussiMVP, Moderator lunedì 12 ottobre 2020 10:25
Tutte le risposte
-
Ciao Gianni,
questa è una delle possibili soluzioni:
;with calendario as( select distinct convert(date, entrata) as giorno from dbo.presenze ), tabellone as( select cal.giorno, d.nominativo, d.matricola from calendario as cal cross join dbo.dipendenti as d ) select T.giorno ,T.nominativo ,iif(exists(select nominativo from dbo.presenze as P where convert(date, P.entrata)=T.giorno and P.matricola=T.matricola),'X','') as Presente ,iif(exists(select nominativo from dbo.presenze as P where convert(date, P.entrata)=T.giorno and P.matricola=T.matricola),'','X') as Assente from tabellone as T
order by 1,2
Ho ipotizzato che le due tabelle abbiano questa struttura:
create table dbo.dipendenti(matricola int not null identity primary key, nominativo nvarchar(128)); create table dbo.presenze(id int not null identity primary key, matricola int not null, entrata smalldatetime not null, uscita smalldatetime null); go create unique index uix_matricola on dbo.presenze(matricola, entrata); create unique index uix_entrata on dbo.presenze(entrata, matricola); go
La soluzione proposta non è ottimale in quanto non tiene conto:
- giorni in cui tutti sono assenti (il CTE "calendario" andrebbe sostituito con tabella dei giorni lavorativi dell'anno)
- turn-over: data assunzione e ritiro di ogni singolo dipendente (i ritirati e/o i non ancora assunti alla data risultano tra gli assenti
Giorgio
- Contrassegnato come risposta Edoardo BenussiMVP, Moderator lunedì 12 ottobre 2020 10:25
-