Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1
    Utente di HTML.it L'avatar di arw
    Registrato dal
    Dec 2007
    Messaggi
    149

    sql estrapolare dati mancanti

    Ciao!!!
    devo fare un report che dia evidenza degli Utenti che hanno inserito 15cinalmente e poi chiuso il periodo segnando il lavoro svolto.
    Ho due tabelle, una Utenti e una Lavoro
    tab_Utenti
    idutente COGNOME NOME
    1 rossi mario
    2 verdi enrico
    3 bianchi luca
    4 blu alessandra
    5 celeste sabrina



    tab_Lavoro
    idlavoro idutente data descrizione chiusoQuindicina

    123 1 01-gen-2011 bla bla bla 0chiuso
    124 1 02-gen-2011 bla bla bla 0
    125 1 03-gen-2011 bla bla bla 0
    ...... 1 ................... bla bla bla 0
    134 1 15-gen-2011 bla bla bla 0
    135 1 16-gen-2011 bla bla bla 1aperto
    136 1 17-gen-2011 bla bla bla 1
    ...... 1 18-gen-2011 bla bla bla 1
    ...... 1 ................... bla bla bla 1
    ...... 1 31-gen-2011 bla bla bla 1
    ...... 1 01-feb-2011 bla bla bla 0
    ...... 1 02-feb-2011 bla bla bla 0
    ...... 1 03-feb-2011 bla bla bla 0
    ...... 1 ................... bla bla bla 0
    ...... 1 15-feb-2011 bla bla bla 0

    ...... 2 01-gen-2011 bla bla bla 0
    ...... 2 02-gen-2011 bla bla bla 0
    ...... 2 03-gen-2011 bla bla bla 0
    ...... 2 ................... bla bla bla 0
    ...... 2 15-gen-2011 bla bla bla 0
    ...... 2 16-gen-2011 bla bla bla 1
    ...... 2 17-gen-2011 bla bla bla 1
    ...... 2 18-gen-2011 bla bla bla 1
    ...... 2 ................... bla bla bla 1
    ...... 2 31-gen-2011 bla bla bla 1
    ...... 2 01-feb-2011 bla bla bla 0
    ...... 2 02-feb-2011 bla bla bla 0
    ...... 2 03-feb-2011 bla bla bla 0
    ...... 2 ................... bla bla bla 0
    ...... 2 15-feb-2011 bla bla bla 0

    ...... 3 01-gen-2011 bla bla bla 0
    ...... 3 02-gen-2011 bla bla bla 0
    ...... 3 03-gen-2011 bla bla bla 0
    ...... 3 ................... bla bla bla 0
    ...... 3 15-gen-2011 bla bla bla 0
    ...... 3 16-gen-2011 bla bla bla 1
    ...... 3 17-gen-2011 bla bla bla 1
    ...... 3 18-gen-2011 bla bla bla 1
    ...... 3 ................... bla bla bla 1
    ...... 3 31-gen-2011 bla bla bla 1
    ...... 3 01-feb-2011 bla bla bla 1
    ...... 3 02-feb-2011 bla bla bla 1
    ...... 3 03-feb-2011 bla bla bla 1
    ...... 3 ................... bla bla bla 1
    ...... 3 15-feb-2011 bla bla bla 1
    ...... 3 16-feb-2011 bla bla bla 1
    ...... 3 17-feb-2011 bla bla bla 1
    ...... 3 18-feb-2011 bla bla bla 1
    ...... 3 ................... bla bla bla 1
    ...... 3 29-feb-2011 bla bla bla 1


    Praticamente significa che:

    l'utente (1)rossi mario ha caricato: prima quindicina(dal 01 al 15) di Gennaio Chiudendola, poi la seconda quindicina(dal 16 al 31) di Gennaio Aperta
    poi ha cariato Febbraio prima 15ina chiusa.

    l'utente (2)verdi enrico ha caricato: prima quindicina di Gennaio Chiudendola, poi la seconda quindicina di Gennaio Aperta
    poi ha cariato Febbraio prima 15ina chiusa.

    l'utente (3)bianchi luca ha caricato: prima quindicina di Gennaio Chiudendola, poi la seconda quindicina di Gennaio Aperta
    poi ha cariato Febbraio prima 15ina Aperta e seconda 15ina aperta.

    l'utente (4)blu alessandra NON ha Caricato.

    l'utente (5)celeste sabrina NON ha caricato.



    Il mio report deve dire , filtrando dal 01 gennaio al 29 febbraio 2011, che :
    Rossi Mario 2° quindicina Gen APERTA
    Verdi Enrico 2° quindicina Gen APERTA
    Bianchi Luca 2° quindicina Gen APERTA
    Bianchi Luca 1° quindicina Feb APERTA
    Bianchi Luca 2° quindicina Feb APERTA
    Blu Alessandra 1° quindicina Gen NON Caricato
    Blu Alessandra 2° quindicina Gen NON Caricato
    Blu Alessandra 1° quindicina Feb NON Caricato
    Blu Alessandra 2° quindicina Feb NON Caricato
    Celeste Sabrina 1° quindicina Gen NON Caricato
    Celeste Sabrina 2° quindicina Gen NON Caricato
    Celeste Sabrina 1° quindicina Feb NON Caricato
    Celeste Sabrina 2° quindicina Feb NON Caricato

    (le quindicine Chiuse sono corrette e non devono essere evidenziate proprio perche corrette)

    come faccio a fargli fare questo?
    sopratutto come gli faccio trovare l'utente 4 e 5 (Blu e Celeste) che nella Tabella tab_Lavoro non ci sono non avendo cariato?


  2. #2
    Utente di HTML.it
    Registrato dal
    Jun 2002
    residenza
    Umbria
    Messaggi
    46
    se unisci la tabella utenti alla tabella lavori con LEFT JOIN la query ti darà tutti gli utenti: per quelli che non hanno inserito i dati avrai valore NULL nei campi delle seconda tabella.
    sergio di sunelweb

  3. #3
    Utente di HTML.it L'avatar di arw
    Registrato dal
    Dec 2007
    Messaggi
    149
    Originariamente inviato da serun
    per quelli che non hanno inserito i dati avrai valore NULL nei campi delle seconda tabella.
    no, per questi non ho proprio nessun record caricato.

    Per la prima parte ci sono riuscita ed ho fatto cosi:
    codice:
    SELECT IdUtente, Cognome, Nome, Email, Societa, AreaCompetenza, Mese, Quindicina, Anno, Esiste
    FROM (
    	SELECT DISTINCT tr.IdUtente, tu.Cognome, tu.nome, tu.email, ts.Descrizione AS societa, 
    	ta.Descrizione as AreaCompetenza, MONTH(tr.Data) AS mese, 1 AS quindicina,YEAR(tr.Data) AS anno,'Aperto' as Esiste
    	FROM Tab_Report tr 
    	INNER JOIN Tab_Utenti tu ON tr.IdUtente = tu.IdUtente
    	Left outer join Tab_Societa ts on tu.idsocieta=ts.idsocieta 
    	Left outer join Tab_AreaCompetenza ta on tu.idAreaCompetenza=ta.idAreaCompetenza 
    	WHERE 1=1 and tu.stato=1 and ts.idsocieta=2 AND tu.IdUtente=142
    	and (DAY(tr.Data) <= 15) AND (tr.Chiusura IS NULL OR tr.Chiusura = 0) 
    	and (YEAR(tr.data)='2011')
    
    UNION
    
    	SELECT DISTINCT tr.IdUtente, tu.Cognome, tu.nome, tu.email, ts.Descrizione AS societa, 
    	ta.Descrizione as AreaCompetenza,MONTH(tr.Data) AS mese, 2 AS quindicina,YEAR(tr.Data) AS anno,'Aperto' as Esiste
    	FROM Tab_Report tr 
    	INNER JOIN Tab_Utenti tu ON tr.IdUtente = tu.IdUtente
    	Left outer join Tab_Societa ts on tu.idsocieta=ts.idsocieta 
    	Left outer join Tab_AreaCompetenza ta on tu.idAreaCompetenza=ta.idAreaCompetenza 
    	WHERE 1=1 and tu.stato=1 and ts.idsocieta=2 AND tu.IdUtente=142
    	and (DAY(tr.Data) > 15) AND (tr.Chiusura IS NULL OR tr.Chiusura = 0) 
    	and (YEAR(tr.data)='2011')
    
    ) DERIVEDTBL
    ORDER BY  anno, Cognome,nome,mese, quindicina
    Ma come faccio per quelli che non ci sono?

  4. #4
    Utente di HTML.it
    Registrato dal
    Jun 2002
    residenza
    Umbria
    Messaggi
    46
    beh, se non esistono neanche nella prima tabella non potrai mai estrarli, ma probabilmente non ho capito come deve funzionare.
    La tabella degli utenti non contiene "tutti" gli utenti?
    E poi non ho capito perchè fai una UNION, se non sbaglio a leggere l'unica differenza è fr (DAY(tr.Data) <= 15) e (DAY(tr.Data) > 15) , quindi basterebbe togliere queste condizioni per fare tutto con una sola query.
    sergio di sunelweb

  5. #5
    Utente di HTML.it L'avatar di arw
    Registrato dal
    Dec 2007
    Messaggi
    149
    mi serve la distinzione di 1° quindicina e 2° quindicina per cui le due query uguali diversificate solo dalla (DAY(tr.Data) <= 15) e (DAY(tr.Data) > 15) .

    Si la tabella Utenti ha TUTTI gli utenti, mentre nella tabella Lavoro ci sono solo gli utenti che hanno inserito.

  6. #6
    Utente di HTML.it
    Registrato dal
    Jun 2002
    residenza
    Umbria
    Messaggi
    46
    OK, allora prova LEFT invece di Inner, ti dovrebbe dare comunque tutti gli utenti anche quando non trova nulla nell'altra tabella.

    Quanto alla distinzione fra quindicine credo che il campo quindicina che giustamente hai messo nella ORDER by dovrebbe bastare, ma non voglio andare fuori dal tema della tua domanda.
    Fammi sapere se con left funziona.

    Ciao.
    sergio di sunelweb

  7. #7
    Utente di HTML.it L'avatar di arw
    Registrato dal
    Dec 2007
    Messaggi
    149
    no purtroppo no mi da sempre lo stesso risultato ovvero solo gli utenti che hanno caricato e lascito aperto
    ho provato anche a mettere right, ma nulla.

  8. #8
    Utente di HTML.it
    Registrato dal
    Jun 2002
    residenza
    Umbria
    Messaggi
    46
    Scusa, prima non lo avevo notato... a cosa serve tu.IdUtente=142 ?
    sergio di sunelweb

  9. #9
    Utente di HTML.it
    Registrato dal
    Jun 2002
    residenza
    Umbria
    Messaggi
    46
    Comunque dovresti provare qualcosa di simile:


    codice:
    SELECT DISTINCT tr.IdUtente, tu.Cognome, tu.nome, tu.email, ts.Descrizione AS societa, 
    	ta.Descrizione as AreaCompetenza, MONTH(tr.Data) AS mese, truncate((id / 16),0) AS quindicina,YEAR(tr.Data) AS anno,'Aperto' as Esiste
    	FROM Tab_Utenti tu LEFT JOIN Tab_Report tr ON tr.IdUtente = tu.IdUtente
    	Left outer join Tab_Societa ts on tu.idsocieta=ts.idsocieta 
    	Left outer join Tab_AreaCompetenza ta on tu.idAreaCompetenza=ta.idAreaCompetenza
    	WHERE tu.stato=1 and ts.idsocieta=2 
    	and (DAY(tr.Data) <= 15) AND (tr.Chiusura IS NULL OR tr.Chiusura = 0) 
    	and (YEAR(tr.data)='2011')
    order by ....
    ovviamente non posso testare la query, quindi potrei aver commesso qualche errore di scrittura, ma il concetto dovrebbe essere chiaro
    sergio di sunelweb

  10. #10
    Utente di HTML.it L'avatar di arw
    Registrato dal
    Dec 2007
    Messaggi
    149
    l'ho messo solo per testare un caso solo e non avere l'elenco di tutti tutti gli utenti che sono tantissimi.
    poi non ci sarà.

    però non va' .... può essere un problema di data, che non mi fa funzionare ne left ne rigth outer join?
    però la data mi serve

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.