Query

di il
11 risposte

Query

Buonasera,
sto cercando di tirare fuori dei dati tramite una query ma senza ottenere risultati soddisfacenti, mi spiego, ho 2 tabelle
Clienti: Nome, cognome, fidelity
spese: DataTrans, fidelity
quello che dovrei fare è prendere solo i clienti che non hanno effettuato transazioni (dataTrans) nel 2017

ho provato con between ma chiaramente mi seleziona l'anno che scelgo e nel risultato che ottengo i clienti che mi trova possono tranquillamente aver effettuato transazione anche negli anni successivi.
Grazie in anticipo per chi vorrà aiutarmi

11 Risposte

  • Re: Query

    Avrai anche provato, ma non mostri la tua query.
    Perché?
  • Re: Query

    
    select DTFidelity.Fidelity, DTFidelity.Nome, DTFidelity.Cognome, BSEmissione.DtTrans 
    from DTFidelity, BSEmissione
    where DTFidelity.Fidelity = BSEmissione.Fidelity and BSEmissione.DtTrans not BETWEEN CAST('2017-01-01' AS DATE) AND CAST('2018-12-31' AS DATE)
    group by DTFidelity.Fidelity,DTFidelity.Nome, DTFidelity.Cognome, BSEmissione.DtTrans order by DTFidelity.Fidelity
    
    Hai ragione chiedo scusa, questa è la query.. non riesco ne a non avere duplicati ne ad avere quello che mi serve ovvero chi non ha fatto acquisti dal 2017 ad oggi.
    I risultati che ottengo sono tutti con date non inerenti alle date che ho inserito e quindi giusto, ma se vado a cercare delle fidelity random per vedere i loro acquisti note che ci sono acquisti nel 2017.
    Mi scuso ancora e grazie
  • Re: Query

    Dando per ovvio che il campo DtTrans sia di tipo data Io farei così:
    
    AND Year(BSEmissione.DtTrans) NOT IN (2017,2018) 
    
    Se proprio vuoi utilizzare le date, allora occorre conoscere il tipo di data che è DtTrans, e quindi il formato.
    Normalmente, lo standard è MM/DD/YYYY (se non diversamente indicato) quindi dovrebbe essere sufficiente usare:
    
    AND BETWEEN '01/01/2017' AND '12/31/2018'
    
    A meno che il campo NON sia di tipo data (ma sarebbe assurdo e sbagliato se fosse un campo di testo) nel qual caso allora occorre fare il CAST.
  • Re: Query

    
    select DTFidelity.Fidelity, DTFidelity.Nome,BSEmissione.DtTrans
    from DTFidelity, BSEmissione 
    where DTFidelity.Fidelity = BSEmissione.Fidelity and Year (BSEmissione.DtTrans) not in(2017,2018) 
    and BSEmissione.IDCodSito=000037 
    and DTFidelity.Fidelity Like 'po%' group by DTFidelity.Fidelity, DTFidelity.Nome,BSEmissione.DtTrans
    
    Ciao Gibra, grazie mille così funziona... approfitto della tua disponibilità, dovrei far si che escano le fidelity una sola volta, ho provato sia con distinct all'inizio sia con group by ma funziona solo se non metto la
    BSEmissione.DtTrans
    nel select.
    ancora una cosa: dovrei restringere ancora la cerchia, ovvero oltre a non aver fatto acquisti nel 2017/2018 ha fatto almeno 2 transazioni nei 6 mesi precedenti quindi al 7/2016.
    Grazie in anticipo
  • Re: Query

    Ti rispondo velocemente perché ho un po' da fare in ufficio.

    E' ovvio che se metti il DtTrans non potrai mai avere una sola riga.

    Per la seconda richiesta, aggiungi una condizione sul Count(*) dei 6 mesi
  • Re: Query

    Ok.. ho aggiunto nella select
     COUNT(1) as Cnt e ho messo alla fine having count(BSEmissione.DtTrans)=2
    sembra funzionare.. concordi con me con questo sistema?
  • Re: Query

    Un utlima cosa gibra poi giuro ho finito.. ansi che l'anno devo tirar fuori chi non ha fatto alcuna transazione dal 7/2017 al 12/2017 e almeno 2 nei 6 mesi precedenti.

    l'ho pensata cosi ma non va..
    
    
    select DTFidelity.Fidelity, DTFidelity.Nome,DTFidelity.Cognome, COUNT(1) as Cnt
    from DTFidelity 
    join BSEmissione on DTFidelity.Fidelity = BSEmissione.Fidelity
    where  BSEmissione.DtTrans not BETWeen CAST('2017-07-01' AS DATE) AND CAST('2017-12-31' AS DATE) and BSEmissione.DtTrans BETWEEN CAST('2017-01-01' AS DATE) AND CAST('2017-01-01' AS DATE)
     group by  DTFidelity.Fidelity, DTFidelity.Nome,DTFidelity.Cognome having count(BSEmissione.DtTrans)>=2
    
    
  • Re: Query

    1) Perché continui a fare il CAST sulle date?
    2) Sei sicuro che il formato YYYY-MM-DD sia corretto? IO dubito...
  • Re: Query

    Ti dico la verità ho provato molte query e anche in quella che mi hai sugerito tu alla fine ha funzionato così mettendo year e il between con il cast.. nel db comunque sono salvate in quel formato
  • Re: Query

    Aggiungo che ho provato a verificare i qualche record random e qualcuno per esempio mi risulta abbia fatto transazioni nel 2018 ad esempio.. Ma non capisco dove possa essere l'errore..
  • Re: Query

    MirkoTek ha scritto:


    Ti dico la verità ho provato molte query e anche in quella che mi hai sugerito tu alla fine ha funzionato così mettendo year e il between con il cast.. nel db comunque sono salvate in quel formato
    Ma non capisco il senso del CAST!
    Se il campo è di tipo data, il CAST è inutile, non serve a nulla, dato che tu indichi il valore direttamente nella query.

    Per il resto, non conoscendo la struttura delle tabelle, non avendo a disposizioni i dati, non posso dire altro.
Devi accedere o registrarti per scrivere nel forum
11 risposte