+ Rispondi al Thread
Visualizzazione dei risultati da 1 a 8 su 8

Discussione: Impostare condizione in query sql access

  1. #1
    Junior89 non è in linea Novello
    Post
    28

    Question Impostare condizione in query sql access

    Salve a tutti, mi rivolgo a voi perchè, come al solito, non vedo "una luce chiara e limpida in fondo al tunnel"
    Sono giorni che sbatto la testa su un problema che ho in Access: da una tabella costituita dai campi: CLIENTE|PTF|DIFFERENZA|MESE, devo restituire l'ultimo PTF attivo per ogni cliente (ogni cliente può avere più di un ptf): il controllo da fare è, prima di tutto, sui mesi (vedendo qual è quello più recente; il campo mese ha dati di tipo NUMERO) e, in caso di uguaglianza tra i mesi, sulle differenze (prendendo la massima tra quelle relative allo stesso cliente; differenza è di tipo single).

    Quello che ho pensato di fare è stato usare query sql per fare il confronto tra i mesi, facendo un join tra la tabella e se stessa sullo stesso cliente, mettendo come condizione che mese sia maggiore rispetto a mese1.

    Da qui il blocco: non ho la più pallida idea di come impostare la condizione che "Se mese = mese1, allora restituisci, per ogni cliente, il ptf che ha valore di differenza maggiore rispetto agli altri".

    Avevo ance pensato di ricorrere a vba, ma anche in questo caso trovavo dei blocchi.

    Any help???

    Grazie mille, davvero!!!

  2. #2
    L'avatar di +m+
    +m+
    +m+ non è in linea Scribacchino
    Post
    922
    Francamente non ho capito un granchè
    Metti alcuni dati, e indica il risultato che vorresti ottenere, e ti scrivo la query SQL

  3. #3
    Junior89 non è in linea Novello
    Post
    28
    Buongiorno!
    Allora:

    CLIENTE PTF DIFFERENZA MESE
    001 0035 145 7
    001 0040 678 9
    001 0065 5463 9
    003 0100 7896 5
    003 0123 6,7645E-02 9
    003 0125 0 7
    010 0123 67584 8
    010 0115 4560 8

    Il risultato da ottenere dovrebbe essere:

    CLIENTE PTF DIFFERENZA MESE
    001 0065 5463 9
    003 0123 6,7645E-02 9
    010 0123 67584 8

    Spero così sia un po' più chiaro: si fa il check su mese e se prende quello più recente; se i mesi sono uguali, allora si va a prendere quello con differenza maggiore.

  4. #4
    L'avatar di gibra
    gibra non è in linea Amanuense
    Luogo
    Breganze (VI)
    Post
    5,981
    Prova così:


    codice:
    SELECT Cliente, Max(PTF) AS PTF,  Max(Differenza) AS Differenza,  Max(Mese) AS Mese
    FROM Tabella
    GROUP BY Cliente

  5. #5
    Phil_cattivocarattere non è in linea Scribacchino
    Luogo
    Verona-Mantova
    Post
    1,556
    Quote Originariamente inviato da Junior89 Visualizza il messaggio
    CLIENTE PTF DIFFERENZA MESE
    001 0035 145 7
    001 0040 678 9
    001 0065 5463 9
    003 0100 7896 5
    003 0123 6,7645E-02 9
    003 0125 0 7
    010 0123 67584 8
    010 0115 4560 8

    Il risultato da ottenere dovrebbe essere:

    CLIENTE PTF DIFFERENZA MESE
    001 0065 5463 9
    003 0123 6,7645E-02 9
    010 0123 67584 8

    Spero così sia un po' più chiaro: si fa il check su mese e se prende quello più recente; se i mesi sono uguali, allora si va a prendere quello con differenza maggiore.
    Per ottenere quello che hai chiesto con una query (niente vba) ho dovuto creare una query con una subquery ed una subsubquery.
    Query più interna: dalla tabella raggruppi per CLIENTE e trovi il max di Mese (alias Max_Mese) e la chiamo qry1.
    Query di livello "intermedio": prendi Cliente e Max di Differenza (alias Max_Diff) dalla tabella e Max_Mese da qry1 mettendole in relazione per Cliente e Mese, raggruppando per cliente e Max_Mese; questa è qry2.
    Query principale: dalla tabella prendi CLIENTE e PTF, Max_Diff e Max_Mese da qry2, mettendo in relazione la tabella e qry2 per cliente, Differenza e Mese.
    Si può fare con un'unica query ma per partire potresti fare una query distinta per ogni passaggio, così da sfruttare l'interfaccia grafica di costruzione delle query.
    Ho creato una tabella con i tuoi dati e ho ottenuto il risultato che volevi.

  6. #6
    Phil_cattivocarattere non è in linea Scribacchino
    Luogo
    Verona-Mantova
    Post
    1,556
    Quote Originariamente inviato da gibra Visualizza il messaggio
    codice:
    SELECT Cliente, Max(PTF) AS PTF,  Max(Differenza) AS Differenza,  Max(Mese) AS Mese
    FROM Tabella
    GROUP BY Cliente
    Se funziona... significa che ho sbagliato le mie prove (era stato il mio primo tentativo) perché così prende il valore massimo di ogni campo per Cliente, ma non lo tiene "associato per record".
    La fregatura ad esempio è sul cliente 003 dove restituisce PTF 0125, Differenza 7896 e Mese 9, mentre per il cliente 003 il mese 9 ha PTF 0123 e Differenza 6,7645E-02

  7. #7
    L'avatar di gibra
    gibra non è in linea Amanuense
    Luogo
    Breganze (VI)
    Post
    5,981
    Quote Originariamente inviato da Phil_cattivocarattere Visualizza il messaggio
    Se funziona...
    Infatti ho scritto: prova ...

  8. #8
    Junior89 non è in linea Novello
    Post
    28
    Scusate il ritardo ma questo weekend sono stato fuori e non ho potuto provare quanto suggerito.
    gibra, ho provato la tua soluzione e ho riscontrato le stesse problematiche di cui parlava Phil_cattivocarattere.
    Per quanto riguarda la soluzione proposta da te, Phil...Bè...che dire?!?!? GRAAAAZIEEEEEEE!!!!!

    Funziona!!!!



    Buona giornata!!!

+ Rispondi al Thread

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi