Newsgroup: it.comp.lang.visual-basic
Titolo: [VB6] Tipo di Join

Ho due tabelle con Data e Importo e devo collegarle tramite il campo Data.
Il fatto č che in una delle due tabelle e non so quale, potrebbero esserci 
piů record con quella data.
La query mi deve restituire Data e Importo di entrambe le tabelle anche se 
in una delle due ci sono piů record.
Se faccio un Inner Join la query mi restituisce i record corrispondenti alla 
Data di entrambe le tabelle.
Con Left Join solo quelli di sinistra, Right Join quelli di destra ma io non 
so in quale tabella ci sono piů record.
Che Join uso?
Carmelo 

 Data di entrambe le tabelle.
Quindi?
Alberto
-- 
Noi ammazziamo solo per motivi buoni.
E quando sono buoni, sta a noi indicarlo.
[Guccini]


Quindi se in una tabella ci sono piů record con quella data che nell'altra 
tabella mi restituisce un importo che non č esatto.
Carmelo 

 tabella mi restituisce un importo che non è esatto.
Ma cosa stai dicendo?
Cosa significa che l'importo non è esatto?
E cosa ne sappiamo noi di cosa sia quell'importo?
Posta almeno la query che stai provando, due dati di prova, ciò che 
vuoi ottenere, ecc...
Così proprio non si capisce niente...
Alberto
-- 
Karl Marx: Uno scrittore è produttivo non nella misura in cui produce 
idee, ma nella misura in cui arricchisce l'editore che pubblica le sue 
opere.


Nella Tb PNEntrate ho 3 record con Importo 100,00
Nella Tb PNUscite ho 1 record con Importo -100,00
Devo recuperare la somma degli importi per quella data in pratica una riga 
in cui visualizzo:
Data                Entrate    Uscite
19/01/2008     300.00    -100,00
SELECT PNEntrate.AziendaID, PNEntrate.BancaAzienda, PNEntrate.Data, 
Sum(PNEntrate.Importo) AS Entrate, Sum(PNUscite.Importo) AS Uscite FROM 
PNEntrate INNER JOIN PNUscite ON PNEntrate.Data = PNUscite.Data
GROUP BY PNEntrate.AziendaID, PNEntrate.BancaAzienda, PNEntrate.Data
HAVING (((PNEntrate.AziendaID)=1) AND ((PNEntrate.BancaAzienda)="BNL") AND 
((PNEntrate.Data)=#1/19/2008#));
La query che ho provato è questa e mi restituisce
Data                Entrate    Uscite
19/01/2008     900.00    -900,00
Carmelo 

Nel suo scritto precedente, Carmelo ha sostenuto :

Innanzitutto, hai messo delle condizioni tipicamente da clausola Where 
in una clausola Having, il che è devastante per l'efficienza della 
query, oltre che assolutamente senza senso.
Per quanto riguarda il tuo problema (che non è un problema, è proprio 
che non hai idea di cosa sia un join): un join è una connessione fra 
due set di dati, connessi fra loro da una chiave che eviti o crei le 
ripetizioni a seconda di ciò che si vuole ottenere.
Tu non vuoi ripetizioni, tu vuoi che per ogni data ci sia un totale 
delle entrate ed un totale delle uscite. Quindi la chiave di entrambi i 
dataset deve essere la data. Invece stai usando due dataset che hanno 
chiave record diversa dalla data. A questa devi ricondurti.
Ometto ogni commento sul fatto di usare due tabelle distinte per 
entrate e uscite, immagino che ciò derivi da chissà quale 
considerazione di logica di business. E' una cosa in linea di principio 
molto brutta, ma forse inevitabile nel tuo caso specifico.
Altra cosa che ritengo grave è l'uso dell'inner join anzichè del Full 
Outer Join. Avendo due tabelle diverse e record diversi, tu non puoi 
sapere se in una certa data ci siano state sia entrate che uscite. 
Mancasse una delle due entità, perderesti il record anzichè avere zero 
nella voce mancante.
Non conosco inoltre la tua struttura dati, ma il porre condizioni where 
su una tabella e non sull'altra, e collegarle in base a una chiave che 
non c'entra niente con le medesime condizioni where, è stranissimo, per 
non dire di peggio.
La tua query può essere riscritta grossomodo così:
SELECT
PNEntrate.AziendaID
, PNEntrate.BancaAzienda
, PNEntrate.Data
, COALESCE(PNEntrate.Importo,0) AS Entrate
, COALESCE(PNUscite.Importo,0) AS Uscite
FROM
     (SELECT PNENTRATE.DATA, SUM(PNEntrate.Importo) AS IMPORTO
      FROM PNENTRATE
      WHERE
            (PNEntrate.AziendaID)=1
            AND (PNEntrate.BancaAzienda)="BNL"
            AND (PNEntrate.Data)='20080119'
      GROUP BY PNENTRATE.DATA
     ) AS PNENTRATE
FULL OUTER JOIN
     (SELECT PNUSCITE.DATA, SUM(PNUSCITE.Importo) AS IMPORTO
      FROM PNUSCITE
      GROUP BY PNUSCITE.DATA
     ) AS PNUSCITE
ON PNEntrate.Data = PNUscite.Data
Questa è in sintassi TSql, tu devi solo adattarla alla sintassi del 
dbms che utilizzi (e che non hai citato, anche se immagino sia Access).
Alberto
-- 
Chi semina raccoglie,
ma chi raccoglie si china.
E a quel punto è un attimo...


Intanto ti ringrazion
La tua Query con access mi da errore di sintassi, ho sostituito Coalesce con 
IIF(ecc) ma FULL OUTER JOIN non so proprio con cosa sostituirlo.
Intanto ho risolto in un modo che non mi piace ma funziona, cioè:
Ho creato una tabella Temp con i campi Data, Entrate e Uscite.
Quando apro la finestra scarico i dati delle due tabella che corrispondono 
ai criteri AziendaID e BancaAzienda, una volta popolata la tabella imposto 
la query che mi interessa relativa alle somme per data o per periodo.
Il fatto di creare una tabella per modo di dire superflua non mi piace ma 
non so come risolvere.
Ho provato con una query UNION ALL temporanea ma non funziona.
Ciao Carmelo

 Ho provato con una query UNION ALL temporanea ma non funziona.
Diciamo che non è il giro ottimo, ma anche con una Union All innestata 
dentro ad un group by effettivamente si può fare. Che errore ti dà?
Alberto
-- 
Il tuo stesso identico umore,
ma la divisa di un altro colore


Carmelo 

 usare una query di comando.
Creazione tabella?
Ma no, Union All lo potrai usare come oggetto di un group by, al 
limite...
Piuttosto, non potevi scegliere un dbms appena appena più standard, per 
imparare la gestione dei dati?
Adesso stai bestemmiando per imparare a fare una cosa con strumenti, 
sintassi, logiche, obsolete e poco efficienti, quando il futuro è su 
dbms decisamente più standard...
Alberto
-- 
Friedrich Nietzsche: Un po' di salute ogni tanto è il miglior rimedio 
per l'ammalato.

 dentro ad un group by effettivamente si può fare. Che errore ti dà?
Una cosa di questo tipo?
SELECT SUM(`saldo`) AS `saldo FROM
(
SELECT `importo`, `data` FROM `t_entrate`
UNION ALL
SELECT `importo`, `data` FROM `t_uscite`
) AS `t_movimenti`
GROUP BY `data`
Oppure, se ci sono molti movimenti giornalieri, potrebbe essere meglio
cosi'?
SELECT SUM(`saldo`) AS `saldo` FROM
(
SELECT SUM(`importo`) AS `saldo`, `data` FROM `t_entrate` GROUP BY `data`
UNION ALL
SELECT SUM(`importo`) AS `saldo`, `data` FROM `t_uscite` GROUP BY `data`
) AS `t_saldi`
GROUP BY `data`
Che dici Albe?
Lokar 

 GROUP BY `data`
Lokar

Il 22/12/2008, Lokar ha detto :

Esatto.
Non che Union All mi piaccia molto, usato così.
Però per funzionare funziona, non capisco come mai a Carmelo non 
funzioni.
Alberto
-- 
Georges Pompidou: Un uomo di stato è un politico che dona se stesso al 
servizio della nazione. Un politico è un uomo di stato che pone la 
nazione al suo servizio.


Mi avete messo un pò in confusione con questi campi che non sono delle mie 
tabelle.
Io devo estrapolare i seguenti dati da due tabelle che hanno in comene 
AziendaID, BancaAzienda, DataBanca e Importo che devo chiamare Entrate e 
Uscite a seconda della tabella con i seguenti criteri: AziendaID=1 AND 
BancaAzienda="MPS"
E devo visualizzare in griglia:
DataBanca, somma(Entrate), somma(Uscite)
SELECT PNEntrate.DataBanca, Sum(PNEntrate.Importo) AS Entrate FROM (SELECT 
PNEntrate.DataBanca, PNEntrate.Importo FROM PNEntrate
UNION ALL
SELECT PNUscite.DataBanca, PNUscite.Importo FROM PNUscite) AS Movimenti
GROUP BY PNEntrate.DataBanca
Questa query mi restituisce DataBanca, Entrate e le uscite?
Sarà facile per voi ma purtroppo non per me
Carmelo 

 Sarà facile per voi ma purtroppo non per me
Infatti, ribadisco che per questi esercizi accademici è meglio iniziare 
passo passo, e magari usando fin dall'inizio strumenti standard (che è 
inutile che tu impari a fare queste cose con Access quando il 90% dei 
dbms usa altre sintassi e altre logiche).
Quando poi avrai capito queste cose, che sono, credimi, veramente di 
base, potrai iniziare a sviluppare per lavoro. Altrimenti fai una 
figuraccia tu e rischi di riempire di bug i tuoi software.
Alberto
-- 
Alessandro Bergonzoni: Il tempo vola e noi no. Strano sarebbe se noi 
volassimo e il tempo no, il cielo sarebbe pieno di uomini con 
l'orologio fermo.


SELECT PNEntrate.DataBanca, Sum(Importo) AS Entrate, Sum(Importo) AS Uscite
FROM (SELECT PNEntrate.DataBanca, PNEntrate.Importo FROM PNEntrate WHERE 
(PNEntrate.AziendaID)=1
AND (PNEntrate.BancaAzienda)="MPS"
UNION ALL
SELECT PNUscite.DataBanca, PNUscite.Importo FROM PNUscite WHERE 
(PNUscite.AziendaID)=1
AND (PNUscite.BancaAzienda)="MPS")  AS Saldo
GROUP BY PNEntrate.DataBanca
Questa query mi restituisce le date corrette ma gli importi di entrate e 
uscite no.
   DataBanca Entrate Uscite
      15/01/2008 ¤ 2.900,00 ¤ 2.900,00
      17/01/2008 -¤ 100,00 -¤ 100,00
      18/01/2008 -¤ 300,00 -¤ 300,00
      19/01/2008 ¤ 200,00 ¤ 200,00
      21/01/2008 ¤ 2.100,00 ¤ 2.100,00
      25/01/2008 ¤ 1.000,00 ¤ 1.000,00
      27/01/2008 -¤ 1.100,00 -¤ 1.100,00
15/01 è una data con importo in entrata mentre in uscita dovrebbe essere 0
17/01 è una data con importo in Uscita mentre quindi entrata dovrebbe essere 
0
Questa è la tua query evidentemente la virgola al posto di FULL OUTER JOIN 
non funziona perche mi restituisce solo le date di Entrate e le ripete 4 
volte
SELECT PNEntrate.DataBanca, PNEntrate.Importo AS Entrate, PNUscite.Importo 
AS Uscite
FROM (SELECT PNEntrate.DataBanca, SUM(PNEntrate.Importo) AS Importo FROM 
PNEntrate
WHERE (PNEntrate.AziendaID)=1 AND (PNEntrate.BancaAzienda)="MPS"
GROUP BY PNEntrate.DataBanca )  AS PNEntrate,
(SELECT PNUscite.DATABanca, SUM(PNUscite.Importo) AS Importo FROM PNUscite
WHERE (PNUscite.AziendaID)=1 AND (PNUscite.BancaAzienda)="MPS"
GROUP BY PNUscite.DATABanca)  AS PNUscite;
Comunque Buone feste e grazie
Carmelo 

 Comunque Buone feste e grazie
Buone feste anche a te.
