Query dati non esistenti

di il
30 risposte

Query dati non esistenti

Salve, ho creato un db semplice per degli amici di un club con 2 tabelle utenti (id, cognome (testo),nome (testo)) e pagamenti (id, anno (numerico) e quota (valuta)).
Estrapolo senza problemi i dati dei pagatori degli anni ma non riesco a capire come fare per poter visualizzare se gli utenti non hanno pagato altri anni (mi serve dal 2010).
id nome cognome anno
1 mario rossi 2022 60€ HA PAGATO
2 mario rossi 2021 60€ HA PAGATO
3 mario rossi 2020 60€ HA PAGATO
4 mario rossi 2019 NON HA PAGATO
4 Mario rossi 2018 NON HA PAGATO

Questa e la query che estrapolo i pagamenti per anno

SELECT Contatti.COGNOME, Contatti.NOME, Contatti.CATEGORIA, Pagamenti.Quota, Pagamenti.Anno, Pagamenti.ID_Pagamenti, Contatti.ID
FROM Contatti INNER JOIN Pagamenti ON Contatti.[ID] = Pagamenti.[ID_Pagamenti]
GROUP BY Contatti.COGNOME, Contatti.NOME, Contatti.CATEGORIA, Pagamenti.Quota, Pagamenti.Anno, Pagamenti.ID_Pagamenti, Contatti.ID
HAVING (((Pagamenti.Anno) Like "*" & [Maschere]![Verifica Pagamenti]![Anno] & "*"))
ORDER BY Contatti.COGNOME;
Grazie dei consigli

30 Risposte

  • Re: Query dati non esistenti

    Nella tabella pagamenti il campo ID è il riferimento all'utente?
    nel caso ti suggerisco alcuni cambiamenti per rendere (a mio avviso) migliore la struttura:

    Persone: id_persona (PK), cognome, nome
    Pagamenti: id_pagamento (PK), id_persona (FK), anno, quota

    anche se la quota dovrebbe/potrebbe essere fissa per tutti per anno per cui potresti avere in realtà:
    Persone: id_persona (PK), cognome, nome
    Pagamenti: id_pagamento (PK), id_persona (FK), anno (FK)
    QuoteAnno: anno (PK), quota

    In ogni caso se vuoi capire chi non ha pagato per ogni anno devi creare una SQL che parta dal prodotto cartesiano tra anni e persone (subsquery) e vada in left join con i pagamenti con condizione isnull

    la subquery nel primo caso sarebbe
    
    select distinct p.id_persona, a.anno
    from persone as p, pagamenti as a
    
    nel secondo
    
    select p.id_persona, a.anno
    from persone as p, QuoteAnno as a
    
    preferibile il secondo perchè nel primo se nessuno ha ancora pagato per un anno non "esce" nulla per quell'anno perchè nel cartesiano non ci sarebbe.

    Parti da qui e completa tu il resto con la left e where
  • Re: Query dati non esistenti

    Per me forse manca qualcosa

    meopatacca ha scritto:


    2 tabelle utenti (id, cognome (testo),nome (testo)) e pagamenti (id, anno (numerico) e quota (valuta)).
    Innanzitutto abituati a nominare i campi chiave in maniera esplicita, ossia IDUtente e IDPagamento.
    La tabella Pagamenti deve avere un campo chiave esterna IDUtente. Quindi la relazione Utenti.IDUtente uno-a-molti Pagamenti.IDUtente.

    Poi...non so... a me SQL non è tanto congeniale (a proposito abbi sempre cura di cliccare sul tasto in basso "Editor completo & Anteprima", selezioni la porzione di codice SQL, quindi clicca in alto sul tasto </> (codice) per farlo apparire poi con i tipici caratteri monotype più familiari ai programmatori).
    Potresti allegare una immagine della visualizzazione struttura query?

    P.S.: ho scritto in contemporanea a muttley005.
  • Re: Query dati non esistenti

    Grazie ad entrambi delle risposte
    la tabella utenti e composta da : idutenti(PK), cognome, nome
    la tabella pagamenti e composta : ID (PK),Quota, Anno, IDPagamenti
    la relazione e da idutenti uno-a-molti idpagamenti

    ora provo a creare la query con la sub dalle vostre indicazioni

    Cattura.PNG
    Cattura.PNG

  • Re: Query dati non esistenti

    Hai scritto

    meopatacca ha scritto:


    la tabella utenti e composta da : idutenti(PK), cognome, nome
    la tabella pagamenti e composta : ID (PK),Quota, Anno, IDPagamenti
    se nella pagamenti ID è la PK e hai IDPagamenti allora qualcosa non quadra...
    forse ID è la FK riferita a idutenti della tab.utenti e IDpagamenti è la PK ?!
    ti consiglio a prescindere di riportare sempre un nome + significativo di ID
  • Re: Query dati non esistenti

    Hai perfettamente ragione sui campi, in quanto non ho pensato di nominarli correttamente
    ritornando alle tabella pagamenti ho: ID(PK), Anno Quota, IDpagamenti (e una colonna numerica)
    tabella utenti e: ID(PK), cognome, nome
    la relazione tra loro e tra ID della tabella utenti e IDpagamenti della tabella pagamenti.
  • Re: Query dati non esistenti

    No, nella pagamenti non può essere PK la colonna ID ...
    ID sarà FK e IDpagamenti sarà PK, no?

    EDIT: ... aiuto... da quello che scrivi IDpagamenti è la ID delle persone?!?
    non trovi che sia quantomeno confondente????
  • Re: Query dati non esistenti

    La mia inesperienza e da letture fatte in rete, mi ha portato a questi risultati anche se devo dire funziona tutto.
    Proverò a capire qualcosa di più dalle tue parole.
  • Re: Query dati non esistenti

    Allora la query provo a iniziarla così
    select distinct p.id_persona, a.anno
    from persone as p, pagamenti as a
    ma già mi blocco in quanto non riesco a capire dove appoggiare la join.

    il risultato della query e
    Espr1	anno
    1180	2010
    1180	2011
    1180	2012
    1180	2013
    1180	2014
    1180	2015
    1180	2016
    1180	2017
    1180	2018
    1180	2019
    1180	2020
    1180	2021
    1180	2022
  • Re: Query dati non esistenti

    Se la tua difficoltà sta nello scrivere SQL la questione può essere aggirata e puoi fare quasi tutto (sicuramente le cose base si) da query grafica.
    Procediamo per passi!
    questa SQL è il cartesiano di persone/anni, ok?
    questo codice salvalo come nuova query e chiamalo come vuoi, ad esempio MancatiPagamenti_pre
    ora non devi fare altro che creare una nuova query in mod. struttura, prendi la tab pagamenti e la query appena creata e mettile il join per i 2 campi che identificano persona e anno.
    Fai doppio click sulle 2 linee di join (una alla volta) e seleziona "includi tutte le righe di MancatiPagamenti_pre ..."
    (o qualcosa di simile, non ricordo la dicitura esatta) per passare da INNER a LEFT join.
    Ora Non devi fare altro che selezionare la PK dei pagamenti e scrivere come criterio isnull, oltre ovviamente a selezionare i campi di MancatiPagamenti_pre che ti interessano quindi immagino la persona e l'anno
  • Re: Query dati non esistenti

    Sto seguendo i tuoi preziosi consigli
    SELECT Pagamenti.ID, MancatiPagamenti_pre.COGNOME, MancatiPagamenti_pre.NOME, MancatiPagamenti_pre.Anno, *
    FROM Pagamenti LEFT JOIN MancatiPagamenti_pre ON (Pagamenti.ID = MancatiPagamenti_pre.id_persona) AND (Pagamenti.Anno = MancatiPagamenti_pre.Anno)
    WHERE (((Pagamenti.ID)="isnull"));
    
    ma la query va in errore:
    tipi di dati non corrispondenti nell'espressione criterio
  • Re: Query dati non esistenti

    meopatacca ha scritto:


    ...
    WHERE (((Pagamenti.ID)="isnull"));
    ...
    l'errore è qui, vedi che isnull è scritto tra apici? il che significa che è inteso testo e non come funzione boolean
    prova ad entrare in modalità struttura e cambia il criterio
  • Re: Query dati non esistenti

    Provato con
    WHERE (((Pagamenti.ID)=IsNull([ID])));
    nessun risultato
    WHERE (((Pagamenti.ID)=IsNull));
    errore
    WHERE (((Pagamenti.ID)=Is Null));
    errore
  • Re: Query dati non esistenti

    Togli l'uguale
  • Re: Query dati non esistenti

    WHERE (((Pagamenti.ID) Is Null));
    Non porta nessun risultato, mentre dovrebbe farmi vedere i risultati solo quelli non paganti dal 2010 ad oggi
Devi accedere o registrarti per scrivere nel forum
30 risposte