Newsgroup: it.comp.lang.visual-basic
Titolo: [sql] left join multiplo con somma interna

non sapevo ome spiegarlo brevemente nell'oggetto...:
ho 4 tabelle
arrivi
partenze
partenze2
perdite
devo creare un rapporto giornaliero in cui sia visualizzato
lo stock corrente (dato dalla somma degli arrivi fino ad oggi meno la
somma delle partenze,partenze2 e perdite calcolate ad oggi) e fin qui
nessun problema
poi devo visualizzare anche gli arrivi,partenze e perdite del giorno
corrente
ad esempio:
tipo   stock      arrivi     partenze  ...  perdite
RISO     16          2           1     ...     1
PASTA     2         0.5          0     ...     0
non riesco a legare le due query in modo da aver un singolo recordset
per poterlo agganciare al report.
DB:access 2002 (non posso usare altro al momento)
grazie!
marco

dopo averci passato tutta la notte...ho paura che sia impossibile
realizzare ciò con una sola query (mi serviva appunto per agganciarla
ad un datareport)
sfogliando vecchi post ho trovato che è possibile creare un recordset
e poi aggiungerci dei campi tutto a runtime.
così facendo non vado a modificare la tabella originaria vero?
è possibile farlo anche su query con UNION?
come c?*$?*$!o faccio??!
grazie a tutti
ciao!


Creare un singolo recordset non sarebbe un problema.
Come legarlo ad un report invece è un po' più complesso. Saprei farlo con un 
DataReport, ma non specifichi che strumento utilizzi.
Per la query (ti scrivo la versione Sql-Server che genera un singolo 
recordset, ma se dovessi agganciarla ad un datareport andrei per un'altra 
strada, come già spiegato in diversi thread):
SELECT CODICI.CODICE,
    STOCK=SUM(
    COALESCE(ARRIVI.QTA, 0.0)
    - COALESCE(PARTENZE.QTA, 0.0)
    - COALESCE(PARTENZE2.QTA, 0.0)
    - COALESCE(PERDITE.QTA, 0.0)
    ),
    ARRIVI=0.0,
    PARTENZE=0.0,
    PARTENZE2=0.0,
    PERDITE=0.0,
    LIVELLO="GENERALE"
FROM CODICI
    LEFT OUTER JOIN ARRIVI
    ON ARRIVI.CODICE=CODICI.CODICE
    LEFT OUTER JOIN PARTENZE
    ON PARTENZE.CODICE=CODICI.CODICE
    LEFT OUTER JOIN PARTENZE2
    ON PARTENZE2.CODICE=CODICI.CODICE
    LEFT OUTER JOIN PERDITE
    ON PERDITE.CODICE=CODICI.CODICE
WHERE
    ARRIVI.DATA BETWEEN @DATA_INIZIALE AND @DATA_FINALE
    PARTENZE.DATA BETWEEN @DATA_INIZIALE AND @DATA_FINALE
    PARTENZE2.DATA BETWEEN @DATA_INIZIALE AND @DATA_FINALE
    PERDITE.DATA BETWEEN @DATA_INIZIALE AND @DATA_FINALE
GROUP BY CODICI.CODICE
UNION ALL
SELECT CODICI.CODICE,
    STOCK=SUM(
    COALESCE(ARRIVI.QTA, 0.0)
    - COALESCE(PARTENZE.QTA, 0.0)
    - COALESCE(PARTENZE2.QTA, 0.0)
    - COALESCE(PERDITE.QTA, 0.0)
    ),
    ARRIVI=SUM(
    COALESCE(ARRIVI.QTA, 0.0)
    ),
    PARTENZE=SUM(
   COALESCE(PARTENZE.QTA, 0.0)
    ),
    PARTENZE2=SUM(
    COALESCE(PARTENZE2.QTA, 0.0)
    ),
    PERDITE=SUM(
    COALESCE(PERDITE.QTA, 0.0)
    ),
    LIVELLO="ODIERNO"
FROM CODICI
    LEFT OUTER JOIN ARRIVI
    ON ARRIVI.CODICE=CODICI.CODICE
    LEFT OUTER JOIN PARTENZE
    ON PARTENZE.CODICE=CODICI.CODICE
    LEFT OUTER JOIN PARTENZE2
    ON PARTENZE2.CODICE=CODICI.CODICE
    LEFT OUTER JOIN PERDITE
    ON PERDITE.CODICE=CODICI.CODICE
WHERE
    ARRIVI.DATA BETWEEN @OGGI_MATTINA AND @OGGI_SERA
    PARTENZE.DATA BETWEEN @OGGI_MATTINA AND @OGGI_SERA
    PARTENZE2.DATA BETWEEN @OGGI_MATTINA AND @OGGI_SERA
    PERDITE.DATA BETWEEN @OGGI_MATTINA AND @OGGI_SERA
GROUP BY CODICI.CODICE
Ciao
Alberto
-- 
E tutto mi sembrava andasse bene... 

    PERDITE.DATA BETWEEN @DATA_INIZIALE AND @DATA_FINALE
Emh...
Copia-incolla troppo facile...
Mancano gli AND...


grazie Albe! sei gentilissimo
un piccolo problema...purtroppo al momento sono costretto ad usare
access come db...e gli outer join vanno a farsi benedire...
come datareport uso quello base, standard di VB6sp5
altrimenti posso usare intelliView se puo aiutare a risolvere
ciao
marco

 come datareport uso quello base, standard di VB6sp5
Allora cercati qualche vecchio thread con Recordset Gerarchico, query SHAPE, 
e datareport.
Trovi anche il codice.
Per la query, quella postata andrà più o meno bene anche per SHAPE, 
sostituendo "UNION ALL" con "APPEND".


 (e ci mancherebbe anche...)
infatti mi sbagliavo...però ricordavo questa storia...forse con ver.
precedenti vabbè cmq
dopo aver imparato tante cose nuove grazie ai tuoi suggerimenti,
 ho deciso di lasciar perdere
metto tutto in una grid facile da stampare [mi compro (flexCell a 99$)] e
faccio poi i calcoli su questa
inoltre ha anche tutte le altre funzioni di export di cui avevo bisogno (xls
e xml)
la query stava diventando troppo complessa per poterla effettuare su access
(c'erano anche altri pezzi di cui non ho parlato nel post)
la mia preoccupazione era incentrata soprattutto sulla velocità di
estrazione nel momento in cui i dati collezionati iniziano a diventare
molti...
ciao
 marco


 molti...
Più la cosa diventa complessa, più è doveroso effettuarla lato dbms, perchè 
quanto a 'incastro ed estrazione di dati', la differenza di performance fra 
un motore Sql (anche Jet) e VB, è di qualche ordine di grandezza a favore di 
Sql.
