Aiuto query

iw8ffg

Nuovo Utente
3 Apr 2016
11
0
1
Ciao a tutti, ho bisogno di un aiuto; ho un database mysql che utlizzo per registrare le donazioni sangue della mia associazione formato da una tabella adibita alla registrazione anagrafica del donatore ed un altra tabella dove vengono registrate le singole donazioni che effettua il donatore.

Avrei necessità di creare una query che mi estrae quali sono i donatori (registrati nella prima tabella) che negli ultimi 6 mesi non hanno effettuato alcuna donazione o che l'ultima donazione inserita risale a piu di 6 mesi dalla data corrente.

non so sè sono riuscito a farmi comprendere e grazie mille a chiunque riesce ad aiutarmi.

Se può essere d'aiuto questa e la struttura delle tabelle:

Tabella anagrafica

FIELD TYPE
------------- -----------
id INT(20)
cognome VARCHAR(50)
nome VARCHAR(50)
sesso VARCHAR(50)
luogo_nascita VARCHAR(50)
prov_nascita VARCHAR(50)
data_nascita DATE
indirizzo_res VARCHAR(50)
citta_res VARCHAR(50)
cap_res VARCHAR(50)
provincia_res VARCHAR(50)
e-mail VARCHAR(50)
telefono VARCHAR(50)
cellulare VARCHAR(50)
indirizzo_dom VARCHAR(50)
citta_dom VARCHAR(50)
cap_dom VARCHAR(50)
provincia_dom VARCHAR(50)
luogo_lavoro VARCHAR(50)
tel_lav VARCHAR(50)
tel_dir VARCHAR(50)
preferenza VARCHAR(50)
tipo_prelievo VARCHAR(50)
iscrizione VARCHAR(50)
adesione VARCHAR(50)
DATA DATE
comitato VARCHAR(50)
id_comitato INT(10)

Tabella donazioni
FIELD TYPE
----------- -----------
id INT(5)
DATA DATE
cognome VARCHAR(50)
nome VARCHAR(50)
comitato VARCHAR(50)
tipo VARCHAR(50)
scheda VARCHAR(50)
id_donatore VARCHAR(50)
 
definendo "@dVerifica" la data di separazione tra i "ritardatari" ed i "recenti",
potrebbe andare bene una query del tipo,
SQL:
select * from (
select
  max(d.DATA) as DATA
, d.id_donatore
, a.cognome
, a.nome
, a.sesso
, a.cellulare
from donazioni d
left join anagrafica a
on d.id_donatore = a.id
group by
  d.id_donatore
, a.cognome
, a.nome
, a.sesso
, a.cellulare
) x
where x.DATA < @dVerifica

ho scritto gli elementi separati per renderla più comprensibile possibile

come vedi d "semplifica" le donazioni e "a" semplifica l'anagrafica

aggiungi liberamente altri campi dell'anagrafica allo stesso modo come già li leggi
attento ad aggiungere campi delle donazioni, perché i valori contenuti devono essere univoci
se non lo fossero otterresti righe multiple per lo stesso soggetto ( a prescindere dalla query )

questo l'esempio con relativo risultato
1576886252611.png
 
  • Like
Reactions: iw8ffg
con questa query ottieni la lista delle persone in anagrafica, mai presenti in donazioni
SQL:
select 
  a.cognome
, a.nome
, a.sesso
, a.cellulare
from @anagrafica a
left join @donazioni d
on a.id = d.id_donatore
where d.id_donatore is null
 
Grazie mille marino51, hai centrato a pieno quello che cercavo; ho fatto delle modifiche che mi portano dei risultati che ti inserisco in seguito; che ne pensi?

Codice:
SELECT * FROM (
SELECT
  MAX(d.DATA) AS DATA
, d.id_donatore
, a.cognome
, a.nome
, a.sesso
, a.cellulare
, a.`e-mail`
FROM donazioni d
LEFT JOIN anagrafica a
ON d.id_donatore = a.id
GROUP BY
  d.id_donatore
, a.cognome
, a.nome
, a.sesso
, a.cellulare
, a.`e-mail`
) X
WHERE (
CASE WHEN sesso = 'F' THEN X.DATA < DATE(CURRENT_DATE - INTERVAL 6 MONTH)
     WHEN sesso = 'M' THEN X.DATA < DATE(CURRENT_DATE - INTERVAL 3 MONTH) END);

Grazie


definendo "@dVerifica" la data di separazione tra i "ritardatari" ed i "recenti",
potrebbe andare bene una query del tipo,
SQL:
select * from (
select
  max(d.DATA) as DATA
, d.id_donatore
, a.cognome
, a.nome
, a.sesso
, a.cellulare
from donazioni d
left join anagrafica a
on d.id_donatore = a.id
group by
  d.id_donatore
, a.cognome
, a.nome
, a.sesso
, a.cellulare
) x
where x.DATA < @dVerifica

ho scritto gli elementi separati per renderla più comprensibile possibile

come vedi d "semplifica" le donazioni e "a" semplifica l'anagrafica

aggiungi liberamente altri campi dell'anagrafica allo stesso modo come già li leggi
attento ad aggiungere campi delle donazioni, perché i valori contenuti devono essere univoci
se non lo fossero otterresti righe multiple per lo stesso soggetto ( a prescindere dalla query )

questo l'esempio con relativo risultato
Vedi l'allegato 6832
 
eviterei la "CASE" nella clausola "where" con un più consono
SQL:
WHERE ( X.sesso = 'F' AND X.DATA < DATE(CURRENT_DATE - INTERVAL 6 MONTH) )
   OR ( X.sesso = 'M' AND X.DATA < DATE(CURRENT_DATE - INTERVAL 3 MONTH) );
attento alle parentesi ( … ) OR ( ... )
 
  • Like
Reactions: iw8ffg
una info, che programmi è quello che hai messo lo screen del risultato della query?
 
una info, che programmi è quello che hai messo lo screen del risultato della query

la query é stata provata con
1578409000609.png
un tool presente in tutte le installazioni database di Microsoft

l'immagine é stata postata con un copia incolla dallo
1578409109301.png
strumento da sempre presente in windows,
win 10 propone una nuova versione, ma sono rimasto sulla vecchia perché sufficiente.
 

Discussioni simili