Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2010
    Messaggi
    302

    [MYSQL]Query di select per verificare 2 condizioni

    Un saluto a tutti,
    volevo chiedervi un gentile supporto per effettuare una query di select che confronti due AND.

    In sostanza avrei la necessità di ricavare da una tabella, tutti i clienti che hanno una data ultimo intevento riparazione eseguito < di 5 mesi fa ma allo stesso tempo il numero di interventi deve essere >= a 6

    Questa query mi permette di recuperare i valori attesi, ma non so come farmi mostrare solo quelli che hanno un valore COUNT(*) >= 6:

    codice:
    SELECT cliente, marca, modello, seriale, SUM(totale) AS 'Incasso', COUNT(*) AS 'Numero Interventi' FROM tabella WHERE data <= NOW() -INTERVAL 5 month GROUP by seriale ORDER BY COUNT(*), data DESC
    Grazie anticipatamente
    Se volete che la funzione di un programma non venga scoperta dall'utente, descrivetela nella documentazione...

  2. #2
    per i valori delle aggregazioni (tipo COUNT() MIN() AVG() etc) devi usare HAVING (la usi come fosse una WHERE); puoi ovviamente combinare WHERE (per la data di intervento) e la HAVING (per il numero di interventi)

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2010
    Messaggi
    302
    Quote Originariamente inviata da optime Visualizza il messaggio
    per i valori delle aggregazioni (tipo COUNT() MIN() AVG() etc) devi usare HAVING (la usi come fosse una WHERE); puoi ovviamente combinare WHERE (per la data di intervento) e la HAVING (per il numero di interventi)
    Grazie infinite, con il suggerimento proposto ho risolto il problema, lascio la query completa per supportare chi magari verrà dopo di me ed avrà lo stesso problema

    codice:
    SELECT cliente, marca, modello, seriale, SUM(totale) AS 'Incasso', COUNT(*) AS 'Numero Interventi' 
    FROM tabella WHERE data <= NOW() -INTERVAL 5 month 
    GROUP by seriale HAVING COUNT(*) >= 5 ORDER BY data DESC
    Grazie ancora
    Se volete che la funzione di un programma non venga scoperta dall'utente, descrivetela nella documentazione...

  4. #4

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2010
    Messaggi
    302
    Quote Originariamente inviata da optime Visualizza il messaggio
    optime!

    Quote Originariamente inviata da optime Visualizza il messaggio
    optime!
    Buongiorno, mi sono reso conto di una cosa, la query fondamentalmente fa quello che gli viene richiesto ma non soddisfa le mie esigenze

    mi seleziona, si gli interventi 5 mesi a ritroso, ma controllando ho verificato che gli interventi estratti hanno effettuato interventi anche in date successive, pertanto l'estrazione non è veritiera.

    Per portare un esempio, se eseguo la query, mi estrae il cliente Pippo che ha eseguito un intervento 5 mesi fa, ma se lo stesso cliente, con lo stesso seriale avesse eseguito anche un intervento in un periodo più recente me lo andrebbe a scartare, ed io mi ritroverei con i dati sballati.

    In sostanza a me servirebbe individuare solo quei clienti che hanno eseguito l'ultimo intervento 5 mesi fa e non in data successive e che naturalmente cosa che già fa la query hanno un numero di interventi totali >= a 6, giusto per andare ad escludere quei clienti che hanno eseguito pochi interventi.

    Avevo letto della possibilità di aggregare una SELECT con una funzione "NOT IN", ma non riesco a farlo
    avrei voluto implementare una cosa del genere

    codice:
    SELECT cliente,marca,modello,seriale,
    DATE_FORMAT(data,'%d/%m/%Y') AS 'Data ultimo intervento', COUNT(*) AS 'Numero Interventi',
    SUM(totale) AS Incasso, COUNT(*) AS 'Interventi gestiti'  
    FROM tabella 
    WHERE data <= NOW() -INTERVAL 5 month GROUP by seriale HAVING COUNT(*) >=5 
    ORDER BY data DESC
    ... WHERE data <= NOW() -INTERVAL 5 month GROUP by seriale HAVING COUNT(*) >=5
    ORDER BY data DESC
    and seriale NOT IN (SELECT DISTINCT ..... FROM tabella)
    [CODE]



    Mi sono incastrato
    Se volete che la funzione di un programma non venga scoperta dall'utente, descrivetela nella documentazione...

  6. #6
    allora seleziona MAX(data) per avere la data dell'ultimo intervento

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2010
    Messaggi
    302
    Quote Originariamente inviata da optime Visualizza il messaggio
    allora seleziona MAX(data) per avere la data dell'ultimo intervento
    grazie infinite per il supporto che mi stai fornendo, ho eseguito la query andando ad impostare per la data la ricerca con la condizione MAX(data), purtroppo ho fatto una verifica e non restituisce il risultato atteso:

    codice:
    SELECT cliente,marca,modello,seriale,
    DATE_FORMAT(MAX(data),'%d/%m/%Y') AS 'Data ultimo intervento', COUNT(*) AS 'Numero Interventi',
    SUM(totale) AS Incasso, COUNT(*) AS 'Interventi gestiti'  
    FROM tabella 
    WHERE data <= NOW() -INTERVAL 12 month GROUP by seriale HAVING COUNT(*) >=5 
    ORDER BY data DESC
    errata_estrazione.jpg

    Questo record avendo effettuato un intervento successivo a 12 mesi fa non sarebbe dovuto essere estratto
    Se volete che la funzione di un programma non venga scoperta dall'utente, descrivetela nella documentazione...

  8. #8
    1. la data è in formato data?
    2. anche la MAX(DATA) va sotto HAVING essendo una aggregazione

  9. #9
    Utente di HTML.it
    Registrato dal
    Apr 2010
    Messaggi
    302
    Quote Originariamente inviata da optime Visualizza il messaggio
    1. la data è in formato data?
    2. anche la MAX(DATA) va sotto HAVING essendo una aggregazione
    Si ti confermo che la data è in formato date

    Potresti postarmi un esempio di aggregazione del MAX(data) con HAVING ?

    Se volete che la funzione di un programma non venga scoperta dall'utente, descrivetela nella documentazione...

  10. #10

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2021 vBulletin Solutions, Inc. All rights reserved.