Home Page
Articoli
Tips & Tricks
News
Forum
Archivio Forum
Blogs
Sondaggi
Rss
Video
Utenti
Chi Siamo
Contattaci
Username:
Password:
Login
Registrati ora!
Recupera Password
Home Page
Stanze Forum
App. WinForms / WPF .NET
Anzianità lavorativa media
martedì 15 aprile 2014 - 21.39
Elenco Threads
Stanze Forum
Aggiungi ai Preferiti
Cerca nel forum
Elenco Tags
VB.NET
|
.NET 4.0
|
Visual Studio 2010
Mau67
Profilo
| Expert
917
messaggi | Data Invio:
mar 15 apr 2014 - 21:39
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
936
messaggi | Data Invio:
mar 15 apr 2014 - 23:10
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
917
messaggi | Data Invio:
mer 16 apr 2014 - 21:12
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
936
messaggi | Data Invio:
gio 17 apr 2014 - 10:23
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
917
messaggi | Data Invio:
gio 17 apr 2014 - 21:48
Ok perfetto risolto grazie
Ciao alla prossima cristian
Mau67
Torna su
Stanze Forum
Elenco Threads
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 !