Conteggio del personale in base alla sede ed al ruolo

di il
7 risposte

Conteggio del personale in base alla sede ed al ruolo

Buona sera.
Ho preparato un nuovo interessante quesito, per il quale non riesco a trovare la via di uscita.
L'azienda ha diverse sedi in più località; per ciascuna sede esiste un "organico" dei vari ruoli del personale, cioè è stato fissato il numero di dirigenti, responsabili, capisquadra ed operai che ciascuna sede dovrebbe avere per operare a regime ottimale.
Questi dati sono inseriti nella tabella [1El_Reparto]
[Reparto] - località della Sede - Chiave primaria
[Org_tot] - Numero complessivo personale previsto
[Org_Dir] - Numero dirigenti previsti
[Org_Resp] - Numero responsabili previsti
[Org_Capos] - Numero caposquadra previsti
[Org_Oper] - Numero operai previsti

In una seconda tabella [Personale1], sono registrati tutti i dipendenti dell'azienda, cmpleti di dati anagrafici, ruolo rivestito, sede di impiego, matricola (chiave primaria),...
Capita che il personale possa essere trasferito da una sede all'altra, o che alcuni vadano in pensione e vengano reintegrati con nuovo personale, che alcuni vengano "promossi" al ruolo superiore... tutti rimangono memorizzati nella tabella, dove ci sono dei campi di verifica (Sì/No) in base alla situazione della posizione attuale.

Vado a cercare di spiegare il mio problema:
Avrei necessità di realizzare un report (in realtà una o più query) nel quale vengano visualizzate TUTTE le sedi;
Per ciascuna di esse (in orizzontale), il numero del personale previsto per ciascun ruolo, il numero del personale attualmente presente per ciascun ruolo, la differenza di personale (previsto-presente) per ciascun ruolo!
Mi viene da piangere!

L'unico approccio che mi è venuto in mente è quello di contare il personale presente per ciascun singolo ruolo, per poi "raggruppare i risultati" successivamente attraverso una apposita query riepilogativa.
Secondo questo principio, ho approntato questa query, per contare, ad esempio, i "capisquadra":
=========================
SELECT [1El_Reparto1].Reparto AS RepartoOrg, Personale1.Ruolo_incarico, Count(Personale1.Matr) AS TotCapos
FROM 1El_Reparto1 LEFT JOIN Personale1 ON [1El_Reparto1].Reparto = Personale1.Reparto
GROUP BY [1El_Reparto1].Reparto, Personale1.Ruolo_incarico
HAVING (((Personale1.Ruolo_incarico)="CAPOSQUADRA"));
=========================
Il risultato di questa query, NON include le sedi nelle quali non è presente personale con tale incarico, nonostante l'utilizzo del "left join" o "right join" che, da quanto appreso "googlando", dovrebbe proprio servire allo scopo;

La mancata visualizzazione della sede, a mio avviso, è il motivo per il quale la stessa non viene riportata nella query "di riepilogo", nonostante sia presente il personale degli altri ruoli.
Vorrei dare un quadro della situazione descritta nell'immagine allegata (non saprei come meglio fare).
Le tabelle sono copie di quelle in uso effettivo, molto ridotte nei contenuti, per rendere meglio l'idea.
Spero di essere stato abbastanza chiaro nell'esposizione della mia difficoltà
Allegati:
26176_118d7e1a9b39bfbd980e6cd65d79bca2.jpg
26176_118d7e1a9b39bfbd980e6cd65d79bca2.jpg

7 Risposte

  • Re: Conteggio del personale in base alla sede ed al ruolo

    Non ho letto oltre la riga della prima definizione della tabella perché risulta subito evidente la mancata Normalizzazione.

    Devi avere una tabella RUOLI... ed una tabella Organico, se questo è fisso per ogni sito aziendale, altrimenti serve realizzare relazioni Molte a Molti con i siti...
    Supponiamo quindi sia la situazione più semplice ... Non puoi avere n campi ma Devi avere 1 campo(IdRuolo) ed un campo Quantita.

    Questo perché poi nelle anagrafiche dipendenti avrai un campo IdRuolo che ne definisce il.ruolo...

    Insomma prima forse è bene fare uno stepback.
  • Re: Conteggio del personale in base alla sede ed al ruolo

    Robpagna,
    se devi mettere in relazione l'organico previsto, rispetto a quello effettivo (dei vari ruoli e per ciascuna sede) dal momento che per l'organico previsto hai già la relativa tabella (seppure non normalizzata) per determinare l'organico effettivo devi effettuare (con una query) il conteggio dei nominativi per ciascun ruolo e sede.
    Dal momento che la tabella è de-normalizzata (quindi con la sede e le quantità previste nei diversi ruoli) si dovrà convertire anche la query, sopra descritta, attraverso una ulteriore query a campi incrociati (che presenti, in un record, la sede con le totalizzazioni dei diversi ruoli del personale effettivamente ivi impiegato).
    A questo punto avrai l'opportunità di porre in relazione la tabella con la query a campi incrociati ed eventualmente porre dei campi calcolati che presentino, nella sede del reparto di appartenenza, la differenza fra valori previsti ed effettivi per ciascun ruolo.
    Da fare attenzione al tipo di relazione impiegata, per inglobare i dati delle due entità fra loro correlate (per cui, in base al verso, ad esempio se il criterio da applicare è di tipo RIGHT JOIN per includere tutti i record della query a campi incrociati e solo le occorrenze della tabella dei ruoli previsti o LEFT JOIN se viceversa).
  • Re: Conteggio del personale in base alla sede ed al ruolo

    "Normalizzazione"...
    Leggendo anche altri post, mi sto sempre più rendendo conto che viene considerato un aspetto di primaria importanza; effettivamente, condivido il concetto che la logica del "database", inteso come archivio di informazioni, lo richiede.
    E' innegabile, ma di certo non è una giustificazione, che per un neofita autodidatta avere le informazioni "pronte all'uso" siano molto più facili da gestire al suo livello.
    Interverremo anche su questo...

    @Alex ha scritto:


    Devi avere una tabella RUOLI... ed una tabella Organico, se questo è fisso per ogni sito aziendale, altrimenti serve realizzare relazioni Molte a Molti con i siti...
    ...
    Questo perché poi nelle anagrafiche dipendenti avrai un campo IdRuolo che ne definisce il.ruolo...
    Purtroppo ogni sito aziendale ha un organico a misura. Ciascuno è diverso dall'altro.
    Non avrei proprio idea di come organizzare delle tabelle in aderenza al tuo suggerimento.
    Nel mio archivio, esiste una tabella nella quale vengono elencati i ruoli (associati a dei sotto-ruoli che identificano i livelli all'interno dei ciascun ruolo, che ho chiamato "Gradi" - Livello che non mi interessa analizzare) [Id], [Ruolo] e [Grado].
    I campi in relazione tra le tabelle viene definita dalla "descrizione" invece dall'"Id", ma la sostanza non credo si sposti di molto.
    E' vero che ci sono dei dati ridondanti (presenti in più tabelle), ma la corrispondenza è sempre perfetta ed univoca.
    Nel Db non sono definite relazioni dirette (nell'immagine sono presenti a titolo esemplificativo)

    willy55 ha scritto:


    ... per determinare l'organico effettivo devi effettuare (con una query) il conteggio dei nominativi per ciascun ruolo e sede.
    ...Da fare attenzione al tipo di relazione impiegata, per inglobare i dati delle due entità fra loro correlate (per cui, in base al verso, ad esempio se il criterio da applicare è di tipo RIGHT JOIN per includere tutti i record della query a campi incrociati e solo le occorrenze della tabella dei ruoli previsti o LEFT JOIN se viceversa).
    Il problema del quale ho fatto menzione nel mio primo post, verte esattamente su questo.
    Nella query che ho annotato sopra, considerando la tabella Personale e Reparto, non sono riuscito a far visualizzare TUTTI i reparti, laddove il ruolo cercato non fosse presente. Guardando l'immagine, infatti, nel risultato manca "Bari" e "Napoli".
    Allegati:
    26176_ce70f27b54a1ab3e8965dccf46da0e14.jpg
    26176_ce70f27b54a1ab3e8965dccf46da0e14.jpg
  • Re: Conteggio del personale in base alla sede ed al ruolo

    Nella relazione fra due tabelle (Reparti - Personale, del tuo esempio) nel caso in cui si impieghi una semplice join di giunzione (Inner join) si ottengono i record delle due tabelle che includono valori ove vi è corrispondenza nel campo comune.
    https://support.office.com/it-it/article/operazione-inner-join-b9e73ab6-884a-403e-9f22-cb502feae36a
    Quindi se si vuole visualizzare tutti i Reparti (oltre quelli forniti dalla inner join) si deve modificare proprio la relazione INNER JOIN in LEFT JOIN o RIGHT JOIN (agendo sul codice SQL oppure tramite interfaccia, passando dal tipo 1 a 2 o 3) in base al nome della tabella che risiede a sinistra (o destra) nel pannello di selezione delle relazioni.
    https://support.office.com/it-it/article/guida-alle-relazioni-tra-tabelle-30446197-4fbe-457b-b992-2f6fb812b58f
    https://support.microsoft.com/it-it/help/304466/how-to-define-relationships-between-tables-in-an-access-database
    https://support.office.com/it-it/article/collegare-tabelle-e-query-3f5838bd-24a0-4832-9bc1-07061a1478f6
    https://support.office.com/it-it/article/creare-modificare-o-eliminare-una-relazione-dfa453a7-0b6d-4c34-a128-fdebc7e686af
    Con l'occasione consiglio di approfondire questi argomenti; per iniziare si può leggere questi documenti:
    https://support.office.com/it-it/article/operazioni-left-join-right-join-ebb18b36-7976-4c6e-9ea1-c701e9f7f5fb

    https://www.w3schools.com/sql/sql_join_inner.as
    https://www.w3schools.com/sql/sql_join_left.as
    https://www.w3schools.com/sql/sql_join_right.as
    https://www.techonthenet.com/access/queries/joins2.ph
    https://datatofish.com/full-outer-join-in-access
  • Re: Conteggio del personale in base alla sede ed al ruolo

    Solo per aggiornamento:
    alla fine, cercando di capire (ed applicare) le indicazioni sui Join, sono riuscito ad ottenere il risultato che cercavo.
    I dati presenti nelle mie tabelle, seppure certamente ridondanti, soddisfano i criteri di applicazione.
    Con più calma, cercherò di trovare il modo di normalizzarle al meglio, senza incasinarmi troppo la vita (al mio livello...)
    Da "autodidatta", sbattere la testa sui problemi è l'ideale per migliorarsi.

    Grazie per le indicazioni, suggerimenti e soprattutto per la disponibilità
  • Re: Conteggio del personale in base alla sede ed al ruolo

    Magari descrivi, più dettagliatamente, la soluzione da te adottata (magari è utile ad un futuro lettore del thread).
  • Re: Conteggio del personale in base alla sede ed al ruolo

    Mi ero riservato di capire meglio; c'è qualcosa che non mi è ancora ben chiaro:
    Tabelle e situazioni invariate rispetto ai post precedenti
    - Calcolo dei Capisquadra
    Ho impostato la seguente query, con l'idea di filtrare il ruolo desiderato, mantenendo tutti i ruoli possibili (Tab [Aruoli]):
    SELECT Personale1.Matr, Personale1.Reparto, Aruoli.Ruolo
    FROM Aruoli LEFT JOIN Personale1 ON Aruoli.Ruolo = Personale1.Ruolo
    GROUP BY Personale1.Matr, Personale1.Reparto, Aruoli.Ruolo, Personale1.Ruolo
    HAVING (((Personale1.Ruolo)="CAPOSQUADRA"));
    
    La tabella risultante l'ho utilizzata in una nuova query, questa volta in relazione con la tabella delle sedi, mediate la quale ottengo il conteggio del personale di quel ruolo, visualizzo la quantità prevista ed ottengo la differenza, per tutte le sedi.
    SELECT [1El_Reparto1].Reparto, [1Q_CAPOSQ].Ruolo, Count([1Q_CAPOSQ].Matr) AS Effcapos, [1El_Reparto1].Org_Capos, ([Effcapos]-[Org_Capos]) AS DIFFCapos
    FROM 1El_Reparto1 LEFT JOIN 1Q_CAPOSQ ON [1El_Reparto1].Reparto = [1Q_CAPOSQ].Reparto
    GROUP BY [1El_Reparto1].Reparto, [1Q_CAPOSQ].Ruolo, [1El_Reparto1].Org_Capos;
    
    Il risultato, per la mia necessità è perfetto! Esattamente quello di cui avevo bisogno.
    Laddove non sono presenti capisquadra, restituisce "0", ma elenca comunque tutte le sedi.
    Capos.JPG
    Capos.JPG

    Operazione ripetuta singolarmente per ciascun ruolo ed il tutto riepilogato in una query finale, con ulteriori totali.

    Certo, per gente più esperta, le due query sarebbero state raggruppate (nidificate) in una, o magari direttamente tutte e 9 insieme, ma al momento sono contento di aver raggiunto questo risultato.

    L'aspetto che non mi è ancora chiaro, è la funzione che svolge esattamente la prima query, senza la quale la seconda non restituirebbe il mio risultato.
    Ma non mi arrendo... work in progress.
    ... ma intanto è un altro passo in avanti!

    Mi sento come un bambino con un giocattolo nuovo!!!
Devi accedere o registrarti per scrivere nel forum
7 risposte