Newsgroup: it.comp.appl.access
Titolo: Aiuto per query con GROUP BY (cross)

Scusate il cross ma credo di aver postato in un gruppo errato.
Salute a tutti, 
Scusate la mia ignoramza ma sarei grato a chi potesse illuminarmi sul
perche' questa query restituisce valori errati:
Tabella PRODOTTI
	Idprodotto
	Descrizione
Tabella CARICHI
	IdProdotto
	QuantitaCarico
Tabella SCARICHI
	IdProdotto
	QuantitaScarico
Io vorrei estrarre tutti i prodotti di magazzino ognuno con il totale
dei carichi e degli scarichi (eventualmente anche la giacenza per
differenza)
Ho fatto cosi:
SELECT DISTINCT Prodotti.IdProdotto, Sum(Magazzino.Quantita) AS
Carichi, Sum(MagazzinoScarico.Quantita) AS Scarichi
FROM (Prodotti LEFT JOIN Magazzino ON Prodotti.IdProdotto =
Magazzino.IdProdotto) LEFT JOIN MagazzinoScarico ON Prodotti.IdProdotto
= MagazzinoScarico.IdProdotto
GROUP BY Prodotti.IdProdotto
HAVING (((Sum(Magazzino.Quantita))>0) AND
((Sum(MagazzinoScarico.Quantita))>0)) OR (((Sum(Magazzino.Quantita))>0)
AND ((Sum(MagazzinoScarico.Quantita))>0))
ORDER BY Prodotti.IdProdotto;
ma i valori delle sommatorie sono sempre maggiori del valore reale.
Ho provato in vari modi ma la mia scarsa conoscenza di questa clausola
non mi ha permesso di trovare una soluzione.
Eterna gratitudine a chi mi fornira' qualche dritta.
saluti
Paolo
-- 


Ciao Paolo, nel tentativo di guadagnarmi l'eterna gratitudine  ;-))
ti dico coma farei io:
- una query con totali entrate
- una query con totali uscite
- query finale che lega le due precedenti ai Prodotti.
In questo modo hai sicuramente un solo record per prodotto.
Ti conviene  fare un left join tra Prodotti e le due query altrimenti
(teorico ?) potresti perderti le voci che hanno solo entrate o solo
uscite.
Chiaro ?
Alberto

almorel wrote:

Grazie Alberto, adesso provo come dici tu.
Per l'eterna gratitudine te la mando dopo, se funziona :).
Ciao, grazie
Paolo
-- 

 Paolo
non ho la soluzione al tuo problema ma mi vien da fare una osservazione.
non sarebbe piu' efficiente avere una sola tabella 'movimenti'?
positivi i carichi, negativi gli scarichi e il risultato lo ottieni 
tramite una query su una sola tabella.
-- 
Paolo opg
BE AWARE that this post uses a fake reply-to address
to contact me write to:
janickg ( at ) hotmail ( dot ) com
--

Lemorlenny wrote:

seguendo i tuoi consigli credo di essermi avvicinato alla soluzione:
SELECT MagazzinoScarico.IdProdotto,0 AS SumOfCarichi,
Sum(MagazzinoScarico.QuantitaScarico) AS SumOfScarichi
FROM MagazzinoScarico
WHERE (((MagazzinoScarico.QuantitaScarico)>0))
GROUP BY MagazzinoScarico.IdProdotto
UNION
SELECT Magazzino.IdProdotto, Sum(Magazzino.Quantita) AS SumOfCarichi,0
AS SumOfScarichi
FROM Magazzino
WHERE (((Magazzino.Quantita)>0))
GROUP BY Magazzino.IdProdotto
ORDER BY 1
L'unico inconveniente � che ho il valore CARICHI e SCARICHI di
ogni prodotto riportato su 2 record.
IdProdotto	SumOfCarichi	SumOfScarichi
	1		0			2
	1		30,51			0
	2		0			8
	2		41,5			0
	3		3			0
Comunque e' un passo avanti.
Ciao
Paolo
-- 


SELECT
     M.IDPRodotto,
     Nz(C.QtaCarichi) As Carichi,
     Nz(S.QtaScarichi) As Scarichi,
     Nz(C.QtaCarichi) - Nz(S.QtaScarichi) As Saldo
FROM
     Magazzino As M
LEFT JOIN
     (SELECT
         X.IDProdotto,
         Sum(nz(X.Qta))
     FROM Carichi As X
     GROUP BY X.IDProdotto) As C ON
     M.IDProdotto = C.IDProdotto
LEFT JOIN
     (SELECT
         Y.IDProdotto,
         Sum(nz(Y.Qta))
     FROM Scarichi As Y
     GROUP BY Y.IDProdotto) As S ON
     M.IDProdotto = S.IDProdotto
WHERE
     Nz(C.QtaCarichi) = 0 AND
     Nz(S.QtaScarichi) = 0
Daniele
SELECT
	MagazzinoScarico.IdProdotto,
	Sc.QtaScarichiMagazzinoScarico
	Sc



Ho dimenticato un paio di alias
SELECT
     M.IDPRodotto,
     Nz(C.QtaCarichi) As Carichi,
     Nz(S.QtaScarichi) As Scarichi,
     Nz(C.QtaCarichi) - Nz(S.QtaScarichi) As Saldo
FROM
     Magazzino As M
LEFT JOIN
     (SELECT
         X.IDProdotto,
         Sum(nz(X.Qta))  As QtaCarichi
     FROM Carichi As X
     GROUP BY X.IDProdotto) As C ON
     M.IDProdotto = C.IDProdotto
LEFT JOIN
     (SELECT
         Y.IDProdotto,
         Sum(nz(Y.Qta)) As QtaScarichi


 tramite una query su una sola tabella.
Si in effetti sarebbe piu comodo, ma questa gestione prevede di 
acquisire i carichi e gli scarichi da varie operazioni 'esterne'
che vengono poi consolidate a fine periodo, infatti queste tabelle
che sto elaborando contengono gli storici dei movimenti che drovranno
poi dare l'effettiva giacenza, potrei aggiornare anche un progressivo
carico/scarico durante i vari movimenti ma si complica la gestione
in caso di correzioni, annullamento gruppi di movimenti ecc.
Sto comunque vedendo se arrivo a qualcosa con le UNION.
Grazie comunque.
Paolo
-- 

OneEDP wrote:

Intanto grazie,
sto tentando di 'digerire' la tua query ma a parte la citrosodina che �
a fine ho un problema di sintassi nella join quando tenta di assegnare
all'alias il risultato della select:
(SELECT
         X.IDProdotto,
         Sum(nz(X.Qta))  As QtaCarichi
     FROM Carichi As X
     GROUP BY X.IDProdotto) As C <- Questo non gli piace!
ho estrapolato la select e provato in vari modi ma non sono riuscito
ad assegnare il raggruppamento ad un alias; forse c'e' qualche
problema sull'ordine delle parentesi?.
Grazie di nuovo e saluti
Paolo
-- 


Invece della citrosodina, qui ci vuole il malox.
A me non d� problemi.
Il problema sono gli alias.
Te la scrivo.
SELECT
     M.IDPRodotto,
     Nz(C.QtaCarichi) As Carichi,
     Nz(S.QtaScarichi) As Scarichi,
     Nz(C.QtaCarichi) - Nz(S.QtaScarichi) As Saldo
FROM
     Magazzino As M
LEFT JOIN
     (SELECT
         IDProdotto,
         Sum(nz(Qta)) As QtaCarichi
     FROM Carichi
     GROUP BY IDProdotto) As C ON
     M.IDProdotto = C.IDProdotto
LEFT JOIN
     (SELECT
         IDProdotto,
         Sum(nz(Qta)) As QtaScarichi
     FROM Scarichi
     GROUP BY IDProdotto) As S ON
     M.IDProdotto = S.IDProdotto
WHERE
     Nz(C.QtaCarichi) = 0 AND
     Nz(S.QtaScarichi) = 0
Faccio abuso degli alias in SQL per riciclare l'itellisense e per 
abbreviare l'editing.
Ciao

OneEDP wrote:

Adesso funziona.
E' bastato racchiudere tra parentesi la prima join per evitare un
errore di sintassi ed aggiornare i nomi dei campi.
Ti spedir� una scatola di Malox come ricompensa, tanto ne ho un armadio
pieno!.
Ti ringrazio.
Riporto la query finale per chiudere il thread.
SELECT
    M.IDPRodotto,
    Nz(C.QtaCarichi) As Carichi,
    Nz(S.QtaScarichi) As Scarichi,
    Nz(C.QtaCarichi) - Nz(S.QtaScarichi) As Saldo
FROM
    (Prodotti As M
LEFT JOIN
    (SELECT
        IDProdotto,
        Sum(nz(Quantita)) As QtaCarichi
    FROM Magazzino
    GROUP BY IDProdotto) As C ON
    M.IDProdotto = C.IDProdotto)
LEFT JOIN
    (SELECT
        IDProdotto,
        Sum(nz(QuantitaScarico)) As QtaScarichi
    FROM MagazzinoScarico
    GROUP BY IDProdotto) As S ON
    M.IDProdotto = S.IDProdotto
WHERE
    Nz(C.QtaCarichi) <> 0 OR
    Nz(S.QtaScarichi) <> 0
Grazie ancora e saluti.
Paolo
-- 


Ti ricordo di indicizzare IDProdotto su tutte le tabelle specialmente 
per le query correlate.
Comunque consiglio il cloruro di magnesio :-)
Attenzione a quando riapri in struttura con il qbe di Access... a volte 
ti rimesta dei caratteri dirty e devi ripulirli a mano ogni volta (tipo 
"].")
Ciao
Daniele