Newsgroup: it.comp.appl.access
Titolo: Query e raggruppamenti

Salve a tutti, è un paio di volte che mi trovo nella situazione di dover
usare delle query di appoggio per avere il risultato che voglio, inutile
dire che usare tre query per averne una non mi sembra molto elegante e
vorrei sapere come fare a raggrupparle.
Ad esempio ho una prima query che mi raggruppa degli oggetti per il nome
dell'oggetto, dandomi una somma su una quantità movimentata, ma, visto che
mi serve un filtro sulla data, raggruppa anche per data, creandomi più
righe per ogni oggetto, il mio fine è avere la differenza fra la somma dei
dati e quella dei resi dopo una certa data, devo quindi ricorrere ad
un'altra query che si appoggia alla prima.
Ma non è finita qui in quanto volendo la differenza, quindi un campo
calcolato, se la aggiungo in una query che raggruppa mi fà più righe, una
per ogni risultato della differnza, devo quindi usare una terza query,
senza raggruppamenti, in cui metto l'espressione; tre query per una!
Per chiarezza posto il codice SQL delle tre query.
Grazie a tutti in anticipo per eventuali risposte e in ogni caso per la
pazienza con cui avete letto questo messaggio!
Luigi
Query1:
SELECT [Lista attrezzi cantieri].[id oggetto], [Lista attrezzi
cantieri].descrizione, Sum([X oggetti movimenti].dati) AS SommaDidati,
Sum([X oggetti movimenti].resi) AS SommaDiresi, [Lista attrezzi
cantieri].giacenza, [Lista movimenti].data, [Lista attrezzi cantieri].data1
FROM [Lista movimenti] INNER JOIN ([Lista attrezzi cantieri] INNER JOIN [X
oggetti movimenti] ON [Lista attrezzi cantieri].[id oggetto] = [X oggetti
movimenti].[id oggetto]) ON [Lista movimenti].[ID movimentazione] = [X
oggetti movimenti].[id movimentazione]
GROUP BY [Lista attrezzi cantieri].[id oggetto], [Lista attrezzi
cantieri].descrizione, [Lista attrezzi cantieri].giacenza, [Lista
movimenti].data, [Lista attrezzi cantieri].data1
HAVING ((([Lista movimenti].data)>[Lista attrezzi cantieri].[data1]));
q2:
SELECT Query1.[id oggetto], Query1.descrizione, Sum(Query1.SommaDidati) AS
SommaDiSommaDidati, Sum(Query1.SommaDiresi) AS SommaDiSommaDiresi
FROM Query1
GROUP BY Query1.[id oggetto], Query1.descrizione;
q3:
SELECT q2.[id oggetto], q2.descrizione, q2.SommaDiSommaDidati,
q2.SommaDiSommaDiresi, [SommaDiSommaDidati]-[SommaDiSommaDiresi] AS Espr1
FROM q2;

 ha scritto nel messaggio news:431c0c0f$1...@x-privat.org...

Cominciamo con la cosa più facile che è quella di eliminare la query q3: è
sufficiente fare la differenza direttamente in q2, ovvero:
SELECT Query1.[id oggetto], Query1.descrizione, Sum(Query1.SommaDidati) AS
SommaDiSommaDidati, Sum(Query1.SommaDiresi) AS SommaDiSommaDiresi,
Sum(Query1.SommaDidati) - Sum(Query1.SommaDiresi) As Espr1
FROM Query1
GROUP BY Query1.[id oggetto], Query1.descrizione;
Per quanto riguarda l'aspetto di accorpare q2 e Query1 per ottimizzare
l'operazione occorrerebbe avere la struttura e le relazioni di tutte le
tabelle sulle quali è basata Query1; comunque una soluzione molto empirica è
quella di usare il codice SQL di Query1 come subquery, anzi come tabella
derivata, nella FROM di q2 al posto di Query1, isomma alla fine, salvo
errori od omissioni, si dovrebbe avere un'unica query che abbia il seguente
codice SQL:
SELECT Pippo.[id oggetto], Pippo.descrizione, Sum(Pippo.SommaDidati) AS
SommaDiSommaDidati, Sum(Pippo.SommaDiresi) AS SommaDiSommaDiresi,
Sum(Pippo.SommaDidati) - Sum(Pippo.SommaDiresi) As Espr1
FROM [SELECT [Lista attrezzi cantieri].[id oggetto], [Lista attrezzi
cantieri].descrizione, Sum([X oggetti movimenti].dati) AS SommaDidati,
Sum([X oggetti movimenti].resi) AS SommaDiresi, [Lista attrezzi
cantieri].giacenza, [Lista movimenti].data, [Lista attrezzi cantieri].data1
FROM [Lista movimenti] INNER JOIN ([Lista attrezzi cantieri] INNER JOIN [X
oggetti movimenti] ON [Lista attrezzi cantieri].[id oggetto] = [X oggetti
movimenti].[id oggetto]) ON [Lista movimenti].[ID movimentazione] = [X
oggetti movimenti].[id movimentazione]
GROUP BY [Lista attrezzi cantieri].[id oggetto], [Lista attrezzi
cantieri].descrizione, [Lista attrezzi cantieri].giacenza, [Lista
movimenti].data, [Lista attrezzi cantieri].data1
HAVING ((([Lista movimenti].data)>[Lista attrezzi cantieri].[data1]));]. As
Pippo
GROUP BY Pippo.[id oggetto], Pippo.descrizione;
Questo codice è da testare e comunque presuppongo, come già detto sopra, che
non sia sicuramente il migliore codice per risolvere il tuo problema.
-- 
Roberto
-----------------------------------------------------
il Sito Comune di it.comp.appl.access
http://www.sitocomune.com
----------------------------------------------------


Uao che casino
facciamo un pò d'ordine
Lista attrezzi cantieri
id oggetto
descrizione         Ti sconsigli di usare questa parola, Access la vede come
parola riservata e "se ne impossessa" facendo brutti scherzi
giacenza
data1
[Lista movimenti]
ID movimentazione
data
[X oggetti movimenti]
dati
resi
id oggetto
Credo che queste siano le tre tabelle
Allora fai una sola query
SELECT [x oggetti movimenti].idmovimetazione, (Select data1 from [lista
movimenti] where [lista movimenti].idmovimentazione =( [x oggetti
movimenti].[idmovimetazione] )) AS dataCriterio, [x oggetti
movimenti].idoggetto, (select descrizioneoggetto from [Lista attrezzi
cantieri] where [Lista attrezzi cantieri].[idoggetto] = [x oggetti
movimenti].[idoggetto]) AS DescrOggetto, [x oggetti movimenti].dati, [x
oggetti movimenti].resi
FROM [x oggetti movimenti];
Non avendo dati valorizzati nnon posso essere sicuro ma dovrebbe andare
-- 
_ _
Ciao
MAssimiliano Amendola            
www.accessgroup.it
Cisa - Conferenza Italiana per Sviluppatori Access
Info:  
www.donkarl.com/it


Grazie Roberto, è proprio quello a cui pensavo, poter giocare col testo sql
per accorpare, soluzione non elegantissima, ma sicuramente migliore della
mia.
Grazie!
Luigi


Ora provo, ma non capisco dove sia il criterio data> di data1.
L'importanza delle date è alta, in quanto il database serve a gestire dei
"prestiti" (dati e resi) di materiali che sono a magazzino.
'Data1' è la data in cui si vede quanti oggetti ci sono a magazzino, e
'data' sono le varie movimentazioni, così sò che il magazzino, per ogni
oggetto, sarà la giacenza a data1- i dati dopo data1 + i resi dopo data1.
Luigi