Anzianità lavorativa media

martedì 15 aprile 2014 - 21.39
Tag Elenco Tags  VB.NET  |  .NET 4.0  |  Visual Studio 2010

Mau67 Profilo | Expert

Ciao al forum,
ho un problema di calcolo come vedete nel titolo devo calcolare l'anzianità lavorativa media suddiviso tra uomini e donne, praticamente ho una tabella dove inserisco le date di assunzione e licenziamento di ogni singolo dipendente, ogni dipendente ha più di un periodo lavorativo presso altre aziende.
Praticamente devo calcolare il numero in anni di ogni dipendente maschio, lo stesso per le femmine e calcolare la media lavorativa per gruppo di sesso il tutto con una select.
è possibile farlo?
grazie in anticipo
Mau67

AntCiar Profilo | Expert

Se non sbaglio il DB era in MySql.

Puoi provare con questa:

SELECT tmp.sesso, tmp.AnniLavoratiPerSesso / tmp.NumPersPerSesso AS MediaPerSesso FROM (SELECT Xsesso, SUM(DATEDIFF(Xdatalicenziamento, Xdataassunzione) / 365) as AnniLavoratiPerSesso, COUNT(Xidpersona) as NumPersPerSesso FROM XPersone GROUP BY XSesso) As tmp

visto che non hai dato i nomi dei campi ne ho messo alcuni a caso. Tutto quello che inizia con X lo devi sostituire con i valori corretti (nome tabella e campi) che hai nel DB
Cristian Barca

Mau67 Profilo | Expert

Ciao Cristian grazie per la risposta, il codice lo adattato e te lo riscrivo perchè ho riscontrato un paio di problemi.
1) intanto devo utilizzare 3 tabelle due lo inserite nel codice che mi hai scritto tu la terza non so come legarla nella terza devo filtrare l'azienda
2) il codice mi genera qui tmp.NumPersPerSesso mi restituisce un numero pari a quanti record inseriti

strSQL = "SELECT tmp.sesso, tmp.AnniLavoratiPerSesso / tmp.NumPersPerSesso AS Media,tmp.NumPersPerSesso FROM (SELECT paziente.sesso, SUM(DATEDIFF(paziente_azienda.Data_Licenziamento, paziente_azienda.Data_Assunzione) / 365) as AnniLavoratiPerSesso, COUNT(paziente.CodiceFiscale) as NumPersPerSesso FROM paziente Inner Join" & _
" paziente_azienda On paziente.CodiceFiscale = paziente_azienda.CodiceFiscale GROUP BY paziente.sesso) As tmp"

Un altro problema e che nell'azienda dove i dipendenti lavorano non hanno una data di licenziamento quindi per calcolare l'intervallo tra le due date io direi di far calcolare un data fittizzia che può essere o il 31-12-dell'anno di riferimento oppure la data di stampa.

La terza tabella da inserire è questa (cartella_sanitaria) i campi interessati per lagarla alle altre è (CodiceFiscale) invece con il campo (PartitaIva) mi serve per filtrare i dipendenti relativi a ogni azienda.
Ultimo punto devo esportare la media in un dataset con i campi prestabiliti (Maschi , Femmine) poi vengono visualizzati nel report con i campi fissi.
Spero di essere stato chiaro.
Grazie infinite

Mau67

AntCiar Profilo | Expert

Ciao.

La struttura delle query è questa:

la query più interna (per capirci quella che ha come alias 'tmp') non fa altro che raggruppare per SESSO i pazienti e fa una somma degli anni lavorati e un conteggio del numero di pazienti per un determinato SESSO. In questa fase puoi applicare il filtro per AZIENDA in modo da rendere anche veloce la query. Non ho capito bene se il campo PartitaIVA (usata per filtrare l'azienda) sta nella tabella 'cartella_sanitaria' oppure in altra tabella. Per la data nulla di licenziamento puoi mettere un ifnull e gli passi la data odierna.

Aggiusta questa query inserendo il join con la tabella per filtrare l'azienda e provala per vedere se funziona:

SELECT paziente.sesso, SUM(DATEDIFF(IFNULL(paziente_azienda.Data_Licenziamento, CURDATE()), paziente_azienda.Data_Assunzione) / 365) as AnniLavoratiPerSesso, COUNT(paziente.CodiceFiscale) as NumPersPerSesso FROM paziente INNER JOIN paziente_azienda On paziente.CodiceFiscale = paziente_azienda.CodiceFiscale WHERE .... GROUP BY paziente.sesso


poi una volta sistemata bene la query precedente, sostituiscila all'interno di quella che segue al posto del valore NNNNN

SELECT tmp.sesso, tmp.AnniLavoratiPerSesso / tmp.NumPersPerSesso AS Media, tmp.NumPersPerSesso FROM (NNNNN) as tmp



Per quanto riguarda il fatto dei campi 'Maschi', 'Femmine' la cosa è un po complicata perchè con la query postata ti da i risultati per riga e non per colonna (hai infatti una colonna SESSO, una colonna con la MEDIA e una colonna con il numero di persone per sesso



Cristian Barca

Mau67 Profilo | Expert

Ok perfetto risolto grazie
Ciao alla prossima cristian
Mau67
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5