Newsgroup: it.comp.appl.access
Titolo: Query troppo elaborata, impossibile o query creazione tabella?

Ciao a tutti
mi chiedo se sia possibile ottenere questo
Le tabelle:
tblA                           tblB
Cliente  FatGen08      Cliente  ProspectGen08
AAAA    10.000           AAAA         0
BBBB     20.000          BBBB     15.000
CCCC       8.000          CCCC      5.000
Attualmente la mia query mi restituisce (giustamente da come è
impostata)
Cliente  FatGen08    ProspectGen08   IpotesiFatturato
BBBB     20.000           15.000                   35.000
CCCC       8.000            5.000                    13.000
vincolata a
GROUP BY tblB.Cliente, tblA.ProspGen08
WHERE tblB.Cliente=tblA.Cliente AND tblB.ctrl_prop=True;
Ma io vorrei che mi restituisse:
Cliente  FatGen08    ProspectGen08   IpotesiFatturato
AAAA     10.000               0                       10.000
BBBB     20.000           15.000                   35.000
CCCC       8.000            5.000                    13.000
cioè che mi restituisse COMUNQUE tutti i clienti che hanno un
fatturato (tblA)
e mi associasse l'addove esiste (tblB) la proiezione di fatturato.
Secondo voi è possibile o l'unica strada è query creazione tabella?
Grazie molte a tutti e buona domenica di quel che resta.
Ciao
Eddie

 ha scritto nel messaggio 
news:38fa3b64-e52d-461e...@m44g2000hsc.googlegroups.com...







[Risposta]
Fai un LEFT JOIN tra le tabelle.
SELECT * FROM tblA LEFT JOIN tblB ON tblA.Cliente=tblB.Cliente poi fai la 
condizione WHERE come vuoi e nel caso tutti i calcoli nella colonna 
IpotesiFatturato
Ciao
-- 
Roberto da Parma 

 ha scritto nel messaggionews:38fa3b64-e52d-461e...@m44g2000hsc.googlegroups.com...

[help] Guida di Access
Mediante un'operazione LEFT JOIN è possibile creare un join esterno
sinistro, che include tutti record della prima tabella (quella di
sinistra) di due tabelle, anche se non vi sono valori corrispondenti
ai record della seconda tabella (quella di destra).
Mediante un'operazione RIGHT JOIN è possibile creare un join esterno
destro, che include tutti i record della seconda tabella (quella di
destra) di due tabelle, anche se non vi sono valori corrispondenti ai
record della prima tabella (quella di sinistra).
È ad esempio possibile utilizzare l'operazione LEFT JOIN con le
tabelle Reparti (sinistra) e Impiegati (destra) per selezionare tutti
i reparti, inclusi quelli a cui non sono stati assegnati impiegati.
Per selezionare tutti gli impiegati, inclusi quelli non assegnati ad
alcun reparto, dovrà essere utilizzata l'operazione RIGHT JOIN.
....
.....Roberto, mi vergogno di aver fatto questa domanda.Davvero.
Se solo avessi sprecato qualche minuto in piu' a guardare l'Help in
linea o avessi digitato JOIN nel campo ricerca, non avrei fatto questa
figura da stupido.
Non solo; siccome ho imparato a mie spese quanto sia importante il
fattore tempo e quanto valore abbia per chi lo dedica agli altri, mi
sento ancora piu' costernato.
A mia discolpa posso solo porre l'ansia di recuperare il tempo perso,
la fretta di risolvere ed il presupposto, sbagliato, che tutto sia più
complicato di quanto sembri.Unito (left join) al poco tempo ( le ore
notturne ) dedicato a reimparare.
Chiedo scusa a tutti; spero col tempo di essere sempre meno sciocco e
di chiedere un aiuto al ng solo  per cose veramente complesse.
Ciao
Eddie

 ha scritto nel messaggio 
news:3882347e-36dc-436d...@m73g2000hsh.googlegroups.com...







Ciao
Eddie
Cerca di seguire una piccola regola...
1. controlla l'help di access
2. controlla i libri a tua disposizione
3. controlla i siti dedicati
 
www.accessgroup.it
 
www.sitocomune.com
 
www.alessandrobaraldi.it
 
www.lebans.com
 
www.donkarl.com
 
www.riolab.org
 
www.utteraccess.com
4. fai la domanda direttamente a google
5. fai la domanda all'NG ma rispetta sempre le regole


di chiedere un aiuto al ng solo  per cose veramente complesse.
Ciao Eddie,
a me non sembra una domanda stupida :-)
per il semplice fatto che nel tuo esempio mostri una condizione su un campo 
di TblB, bene se metti in LEFT JOIN Tbla con Tblb e poni un filtro su un 
campo di Tblb (tabella di destra) la LEFT JOIN viene trasformata in INNER 
JOIN perchè la condizione elimina i valori NULL quindi le righe non 
corrispondenti.
Io non ho capito altre cose che servono a comprendere cosa vuoi ottenere,
Perchè hai messo una Group By e a cosa ti serve, ci sono somme ?
Perchè il campo tblA.ProspGen08 presente nella group By non esiste nella 
struttura di Tbla che hai mostrato, forse è solo un errore di copia/incolla 
?
Ciao
Giorgio 

 ha scritto nel messaggionews:3882347e-36dc-436d...@m73g2000hsh.googlegroups.com...

Ciao Giorgio,
innanzitutto grazie nella riqualificazione della mia domanda :-))
Dunque; Si, ci sono somme ed espressioni:
sum( Nz ( tblA.FatGen08+Sum(Nz(tblB.ProspectGen08 / 100)*[Perc]) As
IpotesiFattGen08 ( più altri campi con altre espressioni
parametriche)
GroupBy: Siccome per lo stesso cliente e nello stesso mese, potrei
fare un numero indefinito di proposte ( ma in questa query
non mi interessa il dettaglio) le raggruppo in un valore unico mensile
( gen08-Feb08, etc).
Si , l'ultimo è un errore di copia incolla , in realtà il groupBy è
esattamente al contrario
GROUP BY tblA.Cliente, tblB.ProspGen08
Quindi tu vuoi dirmi che se lascio il filtro sulla tblB , pur facendo
una LEFT JOIN, la "ritrasformo"  in INNER JOIN e quindi non riesco ad
ottenere il risultato voluto?
Purtroppo per me il filtro sulla tblB mi è indispensabile, in quanto
mi va a prendere solo i record che hanno la checkControl_proposta a
True.
Ho capito bene?
Ciao e grazie
Eddie

Ho capito bene?
certo,
Questa è la query con la Left Join
----
SELECT...
FROM  tblA LEFT JOIN TblB
    ON tblA.Nome=Q_TblB.Nome
WHERE tblB.ctrl_prop = True
GROUP BY ...
----
Vediamo un esempio pratico con questi dati
----
tblA
Cliente  FatGen08
AAAA    10.000
BBBB     20.000
CCCC       8.000
tblB
Cliente  ProspectGen08 ctrl_prop
BBBB     15.000         true
CCCC      5.000         false
----
1^ caso
Il Cliente AAAA non ha una riga corrispondente in tblB quindi il valore reso 
di ctrl_prop è NULL.
Nella Where viene esaminato il confronto
WHERE tblB.ctrl_prop=True
che equivale a
WHERE NULL= True quindi NULL = True ?
La risposta è UNKNOWN, l'uguaglianza non si verifica e la riga non viene 
mostrata
2^ Caso
Questo è più semplice Il Cliente CCCC ha una riga corrispondente in  tblB, 
ma il valore di tblB.ctrl_prop è False quindi nella Where l'uguaglianza non 
si verifica e la riga non viene mostrata.
Come vedi la tua Left Join tra tblA e tblB si comporta esattammente come una 
INNER JOIN.
Come risolvere ?
Il sistema più performante in Access è quello di creare una query che filtra 
le righe di TblB in base a ctrl_prop
----
SELECT *
FROM   tblB
WHERE ctrl_prop = True
----
la salvi ad esempio con nome Q_TblB e la usi nella tua query finale in left 
Join con tblA
----
SELECT...
FROM  tblA LEFT JOIN Q_TblB
    ON tblA.Nome=Q_TblB.Nome
GROUP BY ...
----
ovviamente qui non serve la Where perchè il filtro su tblB viene applicato 
in Q_TblB quindi prima di mettere le tabelle in Left Join.
La sintassi SQL standard prevede il modo di fare tutto con una singola 
semplice Left Join, basta spostare il filtro che hai nella Where alla ON 
della left Join, funziona anche in Access JET 4.0, se scrivi la query a 
mano, ma se per sbaglio passi alla modalità grafica e salvi, ti distrugge 
tutto Quindi meglio non usare quest'opzione.
Ciao
Giorgio 

 ha scritto nel messaggionews:175a8dc3-496b-47bf...@m73g2000hsh.googlegroups.com...

Ciao Giorgio.
Grazie e complimenti; la tua sembra essere l'unica soluzione possibile
per ottenere quanto mi occorre
in modo semplice ed efficiente :-)
Ci sarebbe anche un'altra strada.
Visto che ho deciso di riprendere le cose in modo serio, mi sto
organizando con tutta una serie di libri "seri".
Un certo O'Reilly , nel libro "Elaborare dati con Access" tratta in
modo ampio le query.
Lui affronterebbe questo mio problema, con una OUTER JOIN che lega due
tbl sia con LEFT che con RIGHT JOIN.
In pratica restituisce i dati completi di entrambe le tabelle anche se
rispetivamente non presenti sia su lato LEFT che su lato RIGHT.
Ma questo non lo risolverebbe completamente in quanto nemmeno in
questo caso è possibile utilizzare dei filtri.
Probabilmente la soluzione vera sarà laddove si addentra nelle
sottoquery (che ancora non ho approfondito) e qui ...uhmmmm...la tua
soluzione mi sa tanto di sottoquery ...o sbaglio :-)
Una cosa mi è poco chiara; pur lavorando solo in Sql , devo comunque
passare da nuova query, struttura, visualizzaSql. O c'è un altro
metodo per non passare dalla finestra struttura?
Grazie molte per il suggerimento e la tua disponibilità
Ciao
Eddie

Grazie molte per il suggerimento e la tua disponibilità
prego
:-)
Ciao
Giorgio 

 ha scritto nel messaggionews:eb96c71a-d32e-4509...@j22g2000hsf.googlegroups.com...

Esatto , utilizza UNION
Ti riporto il codice che ho testato con due tabelle create al volo
SELECT Fatturato.Cliente,Fatturato.Fatturato, Ipotesi.Ipotesi
FROM Ipotesi LEFT JOIN Fatturato ON
Ipotesi.Cliente=Fatturato.Cliente
UNION SELECT Fatturato.Cliente,Fatturato.Fatturato, Ipotesi.Ipotesi
FROM Ipotesi RIGHT JOIN Fatturato ON
Ipotesi.Cliente=Fatturato.Cliente;
E in effetti visualizzo sia i clienti che hanno un fatturato , e un
valore 0 nelle  ipotesi ,
che quelli che hanno un valore nelle  ipotesi , ma 0 nel
fatturato ... quindi questa è una scorciatoia di un metodo non
supportato
da Access.
Bene bene ...adesso sperimentiamo le tabelle derivate :-)
Buona giornata
Eddie

Bene bene ...adesso sperimentiamo le tabelle derivate :-)
Buon divertimento :-)
Giorgio