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: