none
Estrazione recursiva presenze RRS feed

  • 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

    giovedì 8 ottobre 2020 09:09

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:

    1. giorni in cui tutti sono assenti (il CTE "calendario" andrebbe sostituito con tabella dei giorni lavorativi dell'anno)
    2. 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

    venerdì 9 ottobre 2020 05:15

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:

    1. giorni in cui tutti sono assenti (il CTE "calendario" andrebbe sostituito con tabella dei giorni lavorativi dell'anno)
    2. 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

    venerdì 9 ottobre 2020 05:15
  • Grazie Giorgio

    Faccio subito delle prove


    Gianni

    venerdì 9 ottobre 2020 07:07