Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923

    [MySql] Estrarre 'n' valori maggiori per gruppo

    Non riesco a venire a capo di questa query.
    Vorrei estrarre i 3 importi (campo valore) maggiori con tutti i dati a essi associati per ciascuna società.


    Tab.importi
    codice:
    id_ordine  id_soc   valore
    1               1         10 
    2               1         50
    3               1         30
    4               1         40
    5               1         20
    6               2        100
    7               2        200
    8               2        400
    9               2        500
    10              2        450
    La query che ho scritto è questa

    codice:
    SELECT i1.id_ordine,i1.id_soc,i1.valore
    FROM importi i1
    INNER JOIN importi i2 ON i2.id_soc = i1.id_soc AND i1.valore <= i2.valore
    GROUP BY i1.id_soc,i1.valore
    HAVING COUNT(*) <= 3
    ORDER BY i1.id_soc ASC, i1.valore DESC;
    Apparentemente funziona.
    Se però come valori maggiori di id_soc 1 ho 50,40,40 al posto di 50,40 e 30 allora come risultato della query relativamente al gruppo 1 mi viene mostrato solo 50.
    Se addirittura metto i tre valori maggiori tutti pari a 50 non me ne viene restituito neanche uno

    Come faccio? Grazie a tutti.

  2. #2
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Se raggruppo così
    GROUP BY i1.id_ordine,i1.id_soc

    va un pò meglio, nel senso che se ho 3 valori uguali me li mostra tutti.
    Se però,ad esempio per id_soc 1 ho due volte 50, due volte 40 e una volta 20 mi vengono restituiti solo i due record con valore 50 e nessuno dei due aventi valore 40.

  3. #3
    Originariamente inviato da nicola75ss
    Se raggruppo così
    GROUP BY i1.id_ordine,i1.id_soc

    va un pò meglio, nel senso che se ho 3 valori uguali me li mostra tutti.
    Se però,ad esempio per id_soc 1 ho due volte 50, due volte 40 e una volta 20 mi vengono restituiti solo i due record con valore 50 e nessuno dei due aventi valore 40.
    Posso dirti il perche' ma non darti una soluzione... quell'having con limite a <= 3 ...

    prova a visualizzare la conta e lo capirai da te.

    codice:
    SELECT i1.id_ordine, i1.id_soc, i1.valore,
    count(*) as tot
    FROM importi i1
    INNER JOIN importi i2 ON i2.id_soc = i1.id_soc
    and i1.valore <= i2.valore 
    GROUP BY i1.id_ordine, i1.id_soc
    ORDER BY i1.id_soc ASC, i1.valore DESC;
    il che ti fara' pure capire che non puoi avere una query buona per tutte le stagioni, ma che sara' variabile a seconda dei valori trovati. Dovresti fare in modo di contare le righe estratte e non quelle trovate. Cioe' contarle con il php.

    forse con qualche alchimia di variabili anche in sql, ma non saprei dire se ne vale la pena e sinceramente non ci tento neppure a farlo.


    .

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  4. #4
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Originariamente inviato da piero.mac
    forse con qualche alchimia di variabili anche in sql, ma non saprei dire se ne vale la pena e sinceramente non ci tento neppure a farlo.


    .
    Intanto grazie per la risposta.
    Ci stavo diventando pazzo ed essendoci andato vicino pensavo magari a qualche mia svista.
    Vedrò di escogitare qualcos'altro. Grazie come sempre Piero.

  5. #5
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Originariamente inviato da piero.mac
    forse con qualche alchimia di variabili anche in sql.

    Con questa alchimia son riuscito a farla funzionare.
    codice:
    set @id_soc := 0, @num := 1;
    select * from (
    select *,
       @num := if(@id_soc = id_soc, @num + 1, 1) as riga_numero,
       @id_soc := id_soc as id
    from importi
    order by id_soc asc, valore desc) as tab where riga_numero <= 3;

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 © 2025 vBulletin Solutions, Inc. All rights reserved.