[ACCESS 2010] Query che trova sempre un risultato

sabato 13 ottobre 2012 - 15.39

thebusterazz Profilo | Newbie

Un saluto a tutti quanti.. oggi vi pongo uno dei miei tanti quesiti sperando di trovare una soluzione al problema.

Ecco le informazioni contestuali:

ho due tabelle:

OPERAI (id,nome,busta paga)
ASSEGNI(intestatario,importo)

Ora, queste due entità sono correlate dal fatto che l'intestatario di un assegno è sempre un operaio.
Vorrei creare una query in cui per ogni operaio, INDIPENDENTEMENTE DAL FATTO CHE ABBIA UN ASSEGNO A SUO NOME O MENO,siano presenti le seguenti informazioni:

-nome operaio
-busta paga
-totale importo degli assegni a suo nome
-differenza tra busta paga e totale importo

la query in se per se è semplice, l'unico problema lo rilevo nel quarto campo. In pratica il problema sorge quando non c'è nessun assegno collegato ad un operaio: in questo caso l'operaio non viene visualizzato nella query evidentemente poichè non trova nessun assegno correlato.

Mi sapreste indicare la giusta sintassi per aggirare il problema?

nman Profilo | Newbie

Provo a improvvisare senza leggere bene la domanda:



nella query hai scritto per caso INNER JOIN ?

Prova a sostituirlo con RIGHT JOIN opure LEFT JOIN



Facci sapere

thebusterazz Profilo | Newbie

già provato ma nulla.. non trovando nulla non restituisce neanche il valore zero e semplicemente il record relativo all'operaio non viene visualizzato nell'elenco. A logica mi servirebbe creare una query fittizia che mi restituisca il valore zero relativo alla somma degli importi sempre e comunque, solo che non so come fare.
Ora come ora sto andando avanti inserendo un assegno con importo uguale a zero per aggirare il problema

renarig Profilo | Expert

>OPERAI (id,nome,busta paga)
>ASSEGNI(intestatario,importo)
Bene quindi deduco che i campi "busta paga" e "importo"
sono entrambi numerici ( perche in fondo chiedi la differenza )

>Ora, queste due entità sono correlate dal fatto che l'intestatario
>di un assegno è sempre un operaio.
Quindi nella query la relazione è fra i 2 valori ( testo )
OPERAI.nome
ASSEGNI.intestatario

( Sarebbe meglio nella tabella ASSEGNI indicare l' "id" delloperaio
al posto del nome ..... )

>Vorrei creare una query in cui per ogni operaio, INDIPENDENTEMENTE
>DAL FATTO CHE ABBIA UN ASSEGNO A SUO NOME O MENO
Questa frase la posso intendere in 2 modi
1) hai un operaio di nome Giovanni ma intesti l'assegna alla moglie Francesca
2) hai un operaio di nome Giovanni e l'assegno è SEMPRE intestato a lui
( il dubbio è se ci sono oppure no assegni )

Io SCARTO il 1° modo perchè diversamente dovremmo correggere le tabelle


>siano presenti le seguenti informazioni:
>-nome operaio
>-busta paga
>-totale importo degli assegni a suo nome
>-differenza tra busta paga e totale importo
Ti aggiungo anche l' "id" dell'operaio ( che non fa mai male )
SELECT OPERAI.id, OPERAI.nome, Sum(OPERAI.[busta paga]) AS SBuP, Sum(ASSEGNI.importo) AS SImp, Nz(Sum(OPERAI.[busta paga]),0)-Nz(Sum(ASSEGNI.importo),0) AS Diff FROM OPERAI LEFT JOIN ASSEGNI ON OPERAI.nome = ASSEGNI.intestatario GROUP BY OPERAI.id, OPERAI.nome ;

>la query in se per se è semplice, l'unico problema lo rilevo
>nel quarto campo. In pratica il problema sorge quando non c'è
>nessun assegno collegato ad un operaio: in questo caso l'operaio
>non viene visualizzato nella query evidentemente poichè non trova
>nessun assegno correlato.
Con il "LEFT JOIN" e il "Nz" dovrebbe essere risolto




Facci sapere

thebusterazz Profilo | Newbie

provato ma non risolviamo... credo che il problema non sia che la somma sia nulla, ma il fatto che non esiste nessun assegno correlato.
In pratica quando eseguo la query ho ancora il problema che mi restituisce nell'elenco solo operai che hanno almeno un assegno a loro nome.
:(

renarig Profilo | Expert

>credo che il problema non sia che
>la somma sia nulla, ma il fatto che non esiste nessun assegno
>correlato.
>In pratica quando eseguo la query ho ancora il problema che mi
>restituisce nell'elenco solo operai che hanno almeno un assegno
>a loro nome.

Se ancora non ti restituisce record significa che non ho capito la struttura delle tabelle.


Prova a dettagliarci esattamente le 2 tabelle con
__ Nome Tabella
____ Nome Campi ___ Tipo dati

Poi dicci quali sono i campi relazionati nella query

Poi magari
__ pochi record di esempio della prima tabella
__ pochi record di esempio della seconda tabella
____ Il risultato che vuoi ottenere da quei record di esempio


.

thebusterazz Profilo | Newbie

certo, cerco di essere il più chiaro possibile.
Anzi ti dico esattamente come sono fatte:

Nome tabella:OPERAIO
campi:

-ID OPERAIO ( numerico)
-NOME COMPLETO (testo)
-BUSTA PAGA ( valuta)

Nome tabella: ASSEGNI
campi:

-DATA ASSEGNO (data)
-IMPORTO (valuta)
-INTESTATARIO (numerico)

Detto questo, un assegno ha sempre come intestatario un operaio ( in particolare nel campo ASSEGNO.INTESTATARIO viene salvato OPERAIO.ID_OPERAIO)
In maniera schematica:

OPERAI____________________________ASSEGNI
ID OPERAIO-------------------------------->INTESTATARIO
NOME COMPLETO___________________IMPORTO
BUSTA PAGA_______________________DATA ASSEGNO

Il mio intento ora è quello di creare una query che visualizza le seguenti informazioni: nome completo, busta paga, differenza tra busta paga e somma di assegni a suo nome.
Un esempio pratico, popolo le tabelle con qualche record:

OPERAI (id_operaio,nome completo,busta paga)
01;Giovanni;100€
02;Marco;50€

ASSEGNI (data,id_operaio;importo)
14/10;01;5€
13/09;01;5€
13/08;02;15€

vorrei che la mia query mi visualizzi:

QUERY1 (Nome completo; busta paga; busta paga- somma assegni)
Giovanni;100€;90€
Marco;50€;35€

il mio problema è che , qualora nella tabella assegni non c'è nessun assegno relativo ad un opario, nella query il record relativo all'operaio in questione semplicemente non compare.
Sono stato più chiaro ora? :)

renarig Profilo | Expert

>il mio problema è che , qualora nella tabella assegni non c'è
>nessun assegno relativo ad un opario, nella query il record relativo
>all'operaio in questione semplicemente non compare.
>Sono stato più chiaro ora? :)


Si adesso è chiaro.

Mandami anche il testo di quella query che non ti fa comparire
il record


Grazie

thebusterazz Profilo | Newbie

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

:) grazie mille per il tempo che mi stai dedicando :)

renarig Profilo | Expert

I nomi dei campi che mi hai dato nel post
non corrispondono esattamente ai nomi della query

Comunque ho fatto un mix ragionato.

___________________________________________________


Il problema era nei criteri sui campi
__ Causale
__ Azienda_emittente

Prova a pensarci Tabella Assegni

del campo importo fai la somma
e se non hai assegni la somma è 0

Del campo Causale non fai somma
e se non ci sono assegni risulta "null"
Ma nel criterio ci metti = "Pagamento Operai" !!!!!<<<<<<<<<

Stesso dicasi per il campo Azienda_emittente

_____________________________________________________


Con queste tabelle:

____ Assegni
Intestatario_operaio ...... numerico
importo ...... valuta
Causale ...... testo
Azienda_emettente ...... testo
Data Assegno ...... data




____ Operai
ID ...... numerico
Nome Completo ...... testo
Tot_bpaga ...... valuta


___________________________________________________

La query potrebbe essere questa:




SELECT Operai.ID, Operai.[Nome Completo], Operai.Tot_bpaga AS [Totale Busta Paga], Sum(Assegni.Importo) AS [Totale Assegni], Nz(Operai.Tot_bpaga,0)-Nz(Sum(ASSEGNI.importo),0) AS Storno FROM Operai LEFT JOIN Assegni ON Operai.ID = Assegni.Intestatario_operaio WHERE ( ((Assegni.Causale)="Pagamento Operai") AND ((Assegni.Azienda_emettente)=[Maschere]![Storno_bp/ass]![CasellaCombinata6]) ) OR ( ((Assegni.Causale) Is Null) AND ((Assegni.Azienda_emettente) Is Null) ) GROUP BY Operai.ID, Operai.[Nome Completo], Operai.Tot_bpaga ;



Facci sapere

thebusterazz Profilo | Newbie

appena ho possibilità la provo (domani ti saprò dire)..
ad ogni modo ho effettuato volutamente una semplificazione per meglio spiegarmi, non pensavo che il problema potesse risiedere anche negli altri campi :)
Ad ogni modo ho capito la soluzione che hai dato, speriamo di beccarla..!
Appena la provo ti dico.. ancora grazie

thebusterazz Profilo | Newbie

guarda tutto nella norma.. funziona tutto a perfezione :D alla fine come spesso succede la soluzione era banale ed era davanti ai miei occhi sin da subito :) ti ringrazio ancora per il tempo che mi hai dedicato :D alla prox :D


---sei un boss :D!---
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-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5