Newsgroup: it.comp.lang.visual-basic
Titolo: Problema con Query

Ciao,
devo realizzare una query che selezioni una serie di parametri da una
tabella.
E fin qui...il problema,per me, sorge per l'ultimo campo in quanto deve
contenere la data di scadenza. Questa data viene presa dalla tabella2 se č
presente altrimenti dalla tabella1.
La tabella1 č in relazione 1 a molti con la tabella2.
Altro problema č come dire, nel caso che siano presenti dei records nella
tabella2, di prendere la data piů urgente.
Faccio un esempio pratico cosě forse mi spiego meglio.
Ho una tabella fornitori, la tabella2 contiene i dati dei clienti associati
ad ogni singolo fornitore.
Il fornitore ha piů clienti e nel report devo riportare i dati del fornitore
con la data di consegna del cliente piů urgente.
Sapreste aiutarmi? Thanks
Fabio
--------------------------------
Inviato via 
http://usenet.libero.it

 fornitore con la data di consegna del cliente più urgente.
SELECT T1.*, T2.*,
    COALESCE(T2.DATA_SCADENZA,T1.DATA_SCADENZA) AS DATA_SCAD
FROM
    FORNITORI AS T1
INNER JOIN
    CLIENTI AS T2
ON
    T1.ID_FORNITORE=T2.ID_FORNITORE
E questo ti darebbe la data di scadenza, ma ti visualizza, per ogni
fornitore, tutti i clienti.
Dobbiamo limitarci al cliente con la data più urgente, ossia la prima in
ordine crescente:
SELECT
    T1.ID_FORNITORE,
    T1.DATA_SCADENZA AS DATA_SCAD_T1,
    ID_CLI=
            (SELECT TOP 1 T2.ID_CLIENTE
            FROM CLIENTI AS T2
            WHERE T2.ID_FORNITORE=T1.ID_FORNITORE
            ORDER BY T2.DATA_SCADENZA ASC)
INTO ##T3
FROM FORNITORI AS T1
SELECT
    T1.*,T2.*,
    COALESCE(T2.DATA_SCADENZA,T1.DATA_SCADENZA) AS DATA_SCAD
FROM
    ##T3 AS T1
INNER JOIN
    CLIENTI AS T2
ON T1.ID_FORNITORE=T2.ID_FORNITORE
WHERE T2.ID_CLIENTE=T1.ID_CLI
Questa è la prima che mi viene in mente, ma non so perchè ho la sensazione
che esista qualcosa di più semplice...
Se non ti soddisfa dimmi qualcosa che cerchiamo di ottimizzarla.
Ciao
Alberto

 Sapreste aiutarmi? Thanks
  Sarà l'orario ma io non ho capito un granchè!!!
  Quante tabelle ci sono 2 o 3 ? Tabella 1, fornitori e tabella 2? O Tabella 1
= Fornitori? Cosa significa :"...la data di consegna del cliente più
urgente." la data più recente?Cosa significa se c'è la data la prendo dalla
tabella 2 sennò dalla Tabella 1?
Se ti va di esporre il prob un pò più chiaramente, domani mattina posso
provare a darti una mano, sempre che non risolva prima qualcun'altro.
Ciao


Grazie mille, provo subito!


Forse, grazie ad Alberto, ho trovato la soluzione.
Comunque hai ragione mi sono spiegato malissimo, provo ad essere più chiaro.
Io ho 2 tabelle, la prima FORNITORI e la seconda CLIENTI.
Devo realizzare un report che riporti alcuni dati della tabella FORNITORI e
per ultimo la fatidica data.
In quest'ultimo campo và inserita la data del cliente più urgente se sono
presenti dei clienti altrimenti và presa una data presente della prima
tabella, vale a dire la tabella FORNITORI.
Spero di essermi spiegato meglio ora.
Grazie in anticipo e buona serata,
Fabio


 Spero di essermi spiegato meglio ora.
Sì.
Tanto meglio, che adesso ho capito cosa volevi.
Allora diciamo che l'altra soluzione non è esattamente quello che ti
serviva.
Avevo capito che tu volessi estrarre anche info sui clienti, nonchè la data
più recente, ma considerando che ogni fornitore ha almeno un cliente.
Il caso della data che 'non c'è' io l'avevo capito come data NULL, non come
cliente mancante.
Allora rivediamo la cosa:
SELECT T1.ID_FORNITORE,
    COALESCE(min(T2.DATA_SCADENZA),T1.DATA_SCADENZA) AS DATA_SCAD
INTO ##T3
FROM
    FORNITORI AS T1
LEFT OUTER JOIN
    CLIENTI AS T2
ON T1.ID_FORNITORE=T2.ID_FORNITORE
GROUP BY T1.ID_FORNITORE
SELECT T1.NOME_FORNITORE, ECC....,
    T2.DATA_SCAD
FROM
    FORNITORI AS T1
INNER JOIN
    ##T3 AS T2
ON T1.ID_FORNITORE=T2.ID_FORNITORE
Da verificare quel Coalesce con un Min all'interno...
Ciao
Alberto

 Alberto
Ciao,
innanzitutto grazie mille per le dritte che mi stai fornendo.
Scusa se possono sembrarti domande banali le mie ma per quanto riguarda i
DataBase e la loro programmazione sono alle prime armi.
Detto questo ho provato la query ma mi dŕ 2 errori.
Il primo riguarda la riga INTO ##T3, dice parola non corretta e evidenzia il
#.
Ma T3 devo crearla io prima o la crea automaticamente il DB?
Il secondo errore me lo dŕ per il comando COALESCE, che se ho capito bene mi
trova il primo valore non-Null della lista messa in ordine da min a max. In
Access perň quest'istruzione pare non esistere, sono riuscita a trovarla
solo in SQL.
Ciao e buona giornata,


 riuscita a trovarla solo in SQL.
Non avendo letto alcun riferimento al database che utilizzi, avevo dato per
scontato che tu usassi Sql-Server.
Non conosco abbastanza bene le limitazioni di Access su questo tipo di
sintassi.
Prova a usare una tabella con un nome normale anzichè ## (e ricordati di
eliminarla dopo aver eseguito questa query), e prova isnull o iif al posto
del coalesce.
Buona fortuna.
Ciao
Alberto

 Fabio
 
  Nel caso non tu non avessi ancora rispolto guarda se può esserti ultile
questo :
SELECT Forn.Nome,
       IIf(IsNull([MinDiDataCli]),Forn.Data,MinDiDataCli) AS Data
FROM
  Forn LEFT JOIN Query2 ON Forn.ID=Query2.IDF
Dove Query2 è :
 
    SELECT Cli.IDF, Min(Cli.DataCli) AS MinDiDataCli
    FROM Cli
    GROUP BY Cli.IDF;
In pratica è la stessa soluzione postata più avanti da Alberto, ma già
tradotta secondo la sintassi SQL Access.
Ciao


 Inviato via 
http://usenet.libero.it
Purtroppo oggi non sono ancora riuscito a provare la soluzione di Alberto
perchč bachi piů urgenti mi hanno tolto molto tempo.
Quindi prendo molto volentieri anche la tua soluzione, la proverň appena
potrň.
Grazie mille e buona serata,
Fabio


Ciao,
ho provato oggi la tua soluzione e funziona bene.
Per problemi legati al runtime (credo - ho appena postato un msg al
riguardo) ho bisogno di inglobare le due query in un'unica sola.
Mi č venuta fuori questa:
SELECT Forn.Nome,
       IIf(IsNull([Min(Cli.DataCli)]),Forn.Data,Min(Cli.DataCli)) AS Data
FROM Forn LEFT JOIN Cli ON Forn.ID=Cli.IDF
GROUP BY Cli.IDF;
Ma una volta che la lancio mi compare il seguente messaggio di errore:
"Impossibile eseguire una query che non include l'espressione "Nome"
specificata come parte di una funzione di aggregazione."
Scusa, mi sapresti spiegare il motivo?
Grazie ancora e buona serata,
