Query per trovare la scadenza più remota

di
Anonimizzato11604
il
2 risposte

Query per trovare la scadenza più remota

Salve a tutti, ho la seguente necessità ma non riesco a venirne a capo.

Db MSAccess
Tabella 1: Clienti
CLIEN_cd
CLIEN_cognome
CLIEN_nome
[...altri campi non influenti...]

Tabella 2: Movimenti (si tratta di iscrizioni ad un corso)
MOVIM_CD
MOVIM_Clien_CD
MOVIM_DataReg
MOVIM_DataSca
[...altri campi non influenti...]

Per ogni cliente posso avere più iscrizioni, 1 per ogni anno. Quindi se ad esempio un cliente fa un'iscrizione oggi, il campo MOVIM_DataReg = data odierna mentre MOVIM_DataSca = dataodierna + 365.
Mi serve una query che mi dica quali clienti non hanno rinnovato l'iscrizione da più di 15 mesi, nel senso che mi serve una lista dei clienti da sollecitare poichè la loro iscrizione è scaduta e sono passati più di 15 mesi senza che si siano iscritti di nuovo.

Se invece il cliente si è di nuovo iscritto dopo l'ultima scadenza, ad esempio dopo soli 6 mesi, allora la query non lo deve restituire.

Spero di essere stato chiaro. Grazie e nel frattempo auguri di Buon Natale a tutti.

Francesco

2 Risposte

  • Re: Query per trovare la scadenza più remota

    Ciao io farei una cosa del genere :
    
    SELECT C.CLIEN_CD
    FROM CLIENTI C
    WHERE 450 > ( SELECT (NOW( ) - M.MOVIM_DATASCAD) AS NUM GIORNI
                             FROM MOVIMENTI M
                            WHERE M.MOVIM_CLIENCD = C.CLIENCD)
    
    praticamente : nella subquery ti calcoli da quanto tempo e' scaduto un contratto (now ( ) indica la data odierna) per uno specifico cliente... Quale cliente quello che in quel momento starai analizzando nella query principale. Quindi cicli tutte le righe e restituisci il codice del cliente che ha abbonamento scaduto da piu di 450 giorni (450 giorni = 15 mesi con giorni da 30)
  • Re: Query per trovare la scadenza più remota

    I campi delle Tabelle non sono esplicativi del Tipo, spero, ma sono certo sia così, che siano
    adeguatamente gestite le Relazioni e le PK-FK.

    Quello che non si capisce è se le CAUSALI dei movimenti possono essere diverse... in tal caso la questione si complica, ma non vedendo tabelle CAUSALI lo escluderei.

    Nel tuo caso ti basta accedere alla Tabella Movimenti, per sapere per ogni CLIENTE se ha Iscrizioni>15Mesi...

    Per farlo ti basta Sottrarre ad Oggi 15Mesi, sapendo che è una regola di Base, usare le funzioni preposte al trattamento delle Date per fare operazione sulle stesse.
    Nel tuo caso hai
    DateAdd("m",-15,Date())
    in sostanza SOMMANDO (-15), o sottraendo 15, alla Data attuale in modalità Mesi puoi comparare quelle date della Tabella che sono INFERIORI...
    
    SELECT *
    FROM Clienti INNER JOIN Movimenti ON Clienti.Id_Cl = Movimenti.Id_Cl
    WHERE (Movimenti.DataMovimento)<DateAdd('m',-15,Date());
    Ovviamente sistema il nome dei campi, e fai attenzione che se non incolli il predicato SQL, ma inserisci il criterio nel QBE devi modificare la sintassi della Funzione DateAdd così:
    
    <DateAdd('m';-15;Date())
    Attenzioen anche a non usare Now() in quanto contiene la notazione oraria e per le comparazioni è sbagliato.
Devi accedere o registrarti per scrivere nel forum
2 risposte