Newsgroup: it.comp.appl.access
Titolo: fusione di più query in una sola ed errore di join

Salve a tutti
ho tre tabelle: (scusate, non voglio urlare ma solo visualizzazione grafica
più eloquente, spero!)
INFERMIERI  - uno/molti - TURNI - molti/una DATA
ho costruito una query che mi dà per ciascun infermiere la quantità di turni
effettuati in un dato mese:
SELECT [cognome] & " " & [nome] AS inf, Month([dataturno]) AS mese,
Sum(turno.qturno) AS SommaDiqturno
FROM infermieri INNER JOIN ([date] INNER JOIN turno ON (date.iddata =
turno.lkdata) AND (date.iddata = turno.lkdata)) ON infermieri.IDinf =
turno.IDinf
GROUP BY [cognome] & " " & [nome], Month([dataturno])
HAVING (((Month([dataturno]))=[Quale mese? (digitare un numero da 1 a
12)]));
Ha solo un difetto: se l'infermiere X in quel dato mese no ha fatto turni la
query non lo dà, mentre io vorrei che scrivesse
Tizio    0
Caio    3
Rossi    0.....
se imposto il join in modo che vengano visualizzati tutti i record della
tabella infermieri mi dice errore di join e mi suggerisce di creare due
query e di inserine la prima nella seconda. Mi era sembrayto facile, ma mi
sono perso.
Mi aiutate? Grazie
--
Saluti da
NSantini


left join 
perche'  hai messo il month sulla having?
--
a.cara


Scusami, ho visto che la left join l'hai tentata, ma dovrebbe essere la 
strada giusta, cmq prova a mettere il test del mese sulla where
normalmente sulla having si mettono i test sulle funzioni di
aggregazione
--
a.cara

 wrote in message
3H1c9.34267$ub2.5...@news1.tin.it...

Io farei una query basata solamente sulla tabella Infermieri; in questa
query mi calcolerei la somma dei turni con una DSum inserita in un campo
calcolato. Mi proteggerei con una funzione Nz dalla possibilità di DSum
nulle.
Per dirti qualcoda di più mi servirebbe conoscere la struttura delle tabelle
TURNI e DATA e il modo in cui sono in relazione fra di loro.
--
Roberto
---------------------------------------------
il Sito Comune di it.comp.appl.access:
http://www.sitocomune.com
---------------------------------------------


Innanzitutto ringrazio Alessandro e te Roberto; poi mi preme dichiarare che
la stringa SQL di cui sopra non è farina del mio sacco: ho usato la griglia
qbe dove ho piazzato le mie tabelle, ho trascinato i campi che mi
interessano e quello è il risultato. Bene, dopo il chiarimento....
La tabella Infermieri, oltre al canonico ID (contatore) e cognome e nome,
contiene altri campi con informazioni sull'infermiere e che non influiscono
con le relazioni alle altre tabelle.
La tabella Turno oltre all'ID (contatore) ha i campi dove registro il
Turno ( "a"=mattino, "p"=pomeriggio, "n"=notte), il campo QTurni dove
registro la
quantità dei turni ("a" oppure "p" =1,  "n"=2), è su questo campo che poi
vado a
fare il conteggio (nella query) dei turni effettuati, la chiave esterna
legata all'IDInfermiere e la chiave esterna legata alla tabella Data.
La tabella Data contiene l'ID e un campo dataturno che contiene la data del
turno.
Le relazioni sono 1 "infermiere" molti "turni" e poi 1 "Data" molti "turni"
Nella Query ho inserito un solo campo inf:[cognome & " " & [nome] di
"infermieri", il campo QTurni di "Turni" e dataturno di "Date" ho
raggruppato e nel campo Qturni ho impostato il conteggio; infine nel campo
[dataturno] ho inserito la richiesta =[Quale mese? (1-12)]. Lo scopo è
quello di sapere nel dato mese ogni infermiere quanti turni ha effettuato.
La query funziona solo che se l'infermiere Tizio in quel dato mese non ha
effettuato turni il suo nome non viene presentato e io voglio (o desidero)
che se Tizio non ha fatto turni, la query deve restituire 0 (zero) per
Tizio. Ho pensato che modificando il join tra "infermieri" e "turni" in modo
che presentasse tutti i record di "infermieri" e invece va in errore.
Scusa se mi sono dilungato, ma per amore di chiarezza...
Ciao e Grazie
NSantini

 ha scritto nel messaggio
news:Kaoc9.47969$pX1.1...@news2.tin.it...
[CUT]

Prova a risolvere il problema come ti suggerisce Access, ovvero con due
query in cascata.
Comunque ritengo opportuno che la selezione di dati venga effettuata, oltre
che con il mese, anche con l'anno di dataturno. altrimenti verranno
selezionati i record  di quel mese di tutti gli anni.
La prima, che chiamerai Query1, dovrà avere il seguente codice SQL:
SELECT turno.IDinf, Sum(turno.qturno) AS SommaDiqturno
FROM [date] INNER JOIN turno ON date.iddata = turno.lkdata
WHERE (((Val(Format([dataturno],"mmyyyy")))=Val([Digita il mese e l'anno
nella forma mmaaaa])))
GROUP BY turno.IDinf;
La seconda, che sarà quella che aprirai per avere i risultati cercati, avrà
il seguente codice SQL:
SELECT [nome] & " " & [cognome] AS inf, Format([Digita il mese e l'anno
nella forma mmaaaa],"00\/0000") AS mese, Val(Nz([SommaDiqturno],0)) AS
SommaDiqturno
FROM infermieri LEFT JOIN Query1 ON infermieri.IDinf = Query1.IDinf
ORDER BY [nome] & " " & [cognome];
Dovrebbe funzionare


 Dovrebbe funzionare
e invece mi dice: Riferimento circolare dell'alias 'SommaDiqturno'
nell'elenco Select della definizione della Query
Per me è quasi turco, sono a digiuno di SQL
Ciao e ancora grazie
NSantini

 NSantini
Scusami, ma ho usato due nomi uguali per due campi diversi; prova ad usare,
per la seconda query, questo codice SQL:
SELECT [nome] & " " & [cognome] AS inf, Format([Digita il mese e l'anno
nella forma mmaaaa],"00\/0000") AS mese, Val(Nz([SommaDiqturno],0)) AS
SommaDiTurno
FROM infermieri LEFT JOIN Query1 ON infermieri.IDinf = Query1.IDinf
ORDER BY [nome] & " " & [cognome];
--



Funziona, di primo acchitto (mia moglie č la terza volta che chiama per la
cena e devo andare a lavorare!) e ho fatto una prova velocissima, devo
ancora provarla nella pratica reale. Se non avrai altre risposte considerala
funzionante (e ne sono sicuro!). Scappo: mia moglie, sempre piů spazientita,
chiama per la 4.a volta
Ciao NSantini