Newsgroup: it.comp.appl.access
Titolo: media presenza in un determinato periodo

Ho un una database che contiene i dati dei dipendenti di un'azienda. In 
una delle tabelle vi sono i rapporti di lavoro dei dipendenti con i 
campi "data_Assunzione" e "data_Licenziamento". Vorrei creare una query 
che mi calcoli la media dei dipendenti presenti in un periodo tra due 
date scelte. Dove per media intendo dire che se per esempio il perido è 
di un mese ed un dipendente è assunto il 16 del mese, considerato che è 
presente nel mese per 15 giorni su 30, questo dipendente conta 0,5. Il 
problema che non so risolvere è come faccio a far calcolare il numero 
di giorni di resenza nel periodo scelto laddove ho dei dipendenti 
assunti prima dell'inizio di questo periodo e altri dopo. Non so se 
sono stato felice nell'esposizione e per tanto indico un esempio di 
ricerca da effettuare.
Voglio sapere quanti dipendenti sono in forza nel perido che va dall'1 
aprile 2010 al 30 aprile 2010.
Ho un certo numero di dipendenti assunti prima del 1/4/10 ed in forza 
alla data successiva al 30/4/10.
Altri dipendenti assunti prima dell'1/4 e licenziati entro il 30/4.
Altri dipendenti assunti entro l'1/4 ed in forza successivamente al 
30/4.
Altri assunti entro l'1/4 e licenziati entro il 30/4.
Per cui per quelli assunti e/o licenziati nel periodo devo calcolare 
solo i giorni di loro presenza nel periodo e calcolarlo non come unità 
ma proporzionalmente a alla sua presenza nel perido.
Spero di essere stato chiaro.
Grazie a chi mi da una mano.

Fs ha scritto:

Ho riprodotto la tua situazione.
La tabella dipendenti ha tre campi
matricola
data_assunzione (data effettiva di assunzione)
data_licenziamento (default 31/12/2999 o data effettiva di licenziamento)
Intendiamo interrogare la tabella per un periodo per sapere quanti dipendenti
sono stati presenti per classi di giorni (se la rilevazione va dal 1° al 31
marzo, quanti dipendenti sono stati presenti 30 giorni, quanti 20 e così via)
Utilizziamo la funzione di access Datediff(tipo riportato;inizio;fine)
dove in tipo riportato inseriamo la costante "G" che corrisponde a numero di
giorni, in inizio la data inizio rilevazione e in fine la data di fine
rilevazione.
poichè i dipendenti possono essere stati assunti prima dell'inizio della
rilevazione e inseriamo un controllo in data inizio utilizzando la funzione
Iif(test;se vero;se falso) nel senso che se la data di assunzione è precedente
l'inizio della rilevazione impostiamo l'inizio rilevazione altrimenti lasciamo
la data di assunzione;
per quanto riguarda la data di licenziamento, poichè il default inserito è
sicuramente successivo alla data di fine rilevazione, inseriamo di nuovo la
funzione "Iif" sostituendo la data di default con la data di licenziamento, se
compresa nel periodo di rilevazione altrimenti con la data di fine
rilevazione.
La condizione "having" che seleziona solo i risultati della "datediff" >=0 è
necessaria per eliminare tutte quelle situazioni di dipendenti assunti e
licenziati prima dell'inizio rilevazione.
La funzione "Count" effettua il conteggio dei dipendenti per giorni di
servizio prestato nell'intervallo di rilevazione.
Di seguito la query:
**************************************************
SELECT 
DateDiff("d",IIf([data_ASSUNZIONE]<=#3/1/2011#,#3/1/2011#,
         [data_ASSUNZIONE]),
         IIf([data_LICENZIAMENTO]>#3/31/2011#,#3/31/2011#,
         [data_LICENZIAMENTO])) AS GIORNI_DI_SERVIZIO, 
Count(*) AS NUMERO_DIPENDENTI
FROM dipendenti
GROUP BY 
DateDiff("d",IIf([data_ASSUNZIONE]<=#3/1/2011#,#3/1/2011#,[data_ASSUNZIONE]),I
If([data_LICENZIAMENTO]>#3/31/2011#,#3/31/2011#,[data_LICENZIAMENTO]))
HAVING 
(((DateDiff("d",IIf([data_ASSUNZIONE]<=#3/1/2011#,#3/1/2011#,[data_ASSUNZIONE]
),IIf([data_LICENZIAMENTO]>#3/31/2011#,#3/31/2011#,[data_LICENZIAMENTO])))>=0)
);
***************************************************
Spero ti sia utile
A presto
-- 

peccia scriveva il 31/03/2011 :

Ti ringrazio per l'aiuto, cercherò di mettere in pratica il tuo 
suggerimento e ti faccio sapere.