Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17
  1. #1
    Utente di HTML.it L'avatar di Aires
    Registrato dal
    Jan 2010
    Messaggi
    725

    [MySql] Query che effettua la Media di una Somma

    Ciao a tutti avrei bisogno di un aiutino con 2 query che riguardano più o meno lo stesso argomento:

    Ho una tabella con:
    codice:
    Tabella: Tempi
    Campi: Id, Intervento, tempo_accumulato, priorita
    Ho la necessità di calcolare la somma dei tempi accumulati per ogni intervento e farne una media.

    Per ora con questo codice riesco ad avere il tempo totale per ogni intervento
    codice:
    Select sec_to_time(sum(tempo_accumulato))as Tab, intervento from tempi 
    where intervento > 14589 group by intervento
    Il problema è fare la media di questi tempi e restituire quindi un valore unico. Purtroppo ho provato a usare la funzione avg in vari modi, a dividere il risultato per un count che mi contava gli interventi e vari modi ma non sono mai riuscito ad ottenere il risultato sperato.

    Quindi avrei bisogno di qualche consiglio su come modificare la query affinche mi restituisca una media corretta.

    codice:
    Per facilitare posto un esempio
    
    ID - Intrv - Priorita - tempo_acccumulato
    01 - 10    -  1         - 50
    02 - 10    -  1         - 10
    03 - 11    -  2         - 25
    04 - 10    -  1         - 19
    05 - 11    -  1         - 60   
    
    Risultato Attuale:
    
    Tempo Totale - Intervento - Priorita
    00:01:19       -  01           - 1
    00:01:25       -  02           - 2
    
    Risultato Da Ottenere:
    
    Tempo Totale
    00:01:22 
    (la media quindi senza riferimenti a intervento e priorita)
    __________________________________________________ ____
    Il secondo problema invece è relativo ad una query che deve fare sempre la media del tempo accumulato però suddividerlo per priorità e pescare la prima priorità per ogni intervento.

    Per recuperare la prima priorità per id ho usato questa query
    codice:
    Select intervento, priorita from tempi where id in
    (select * from (select min(id) as id from tempi group by intervento) as tab) 
    group by intervento
    In questo caso ottengo un risultato analogo a sopra in quanto i record ottenuti hanno questa forma
    codice:
    intrv - priorita
    10    -  1
    11    -  2
    Anche in questo caso ho bisogno di ottenere un risultato simile:
    Tempo Totale - Priorita
    00:01:19 - 1
    00:01:25 - 2

    Dove però i tempi sono ottenuti dalla media del totale dei tempi, ricavato raggruppando gli interventi a seconda della loro prima priorità.


    Sperando che qualcuno riesca a capire la mia richiesta ringrazio anticipatamente tutti!
    Originariamente inviato da qazar
    Se finisci di leggere il thread mi sono corretto,è solo i kernel scritto in html.
    Originariamente inviato da rnlflame
    Comunque non dovevano crollare

  2. #2
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Per il primo quesito

    codice:
    select sec_to_time(avg(tempo)) as media from (
    select sum(tempo_accumulato) as tempo
    from tempi
    group by intrv) as t

  3. #3
    Utente di HTML.it L'avatar di Aires
    Registrato dal
    Jan 2010
    Messaggi
    725
    Grazie infinite nicola, per ora mi da il risultato sperato ora vedo di adattarlo al meglio e vi faccio sapere. Grazie davvero
    Originariamente inviato da qazar
    Se finisci di leggere il thread mi sono corretto,è solo i kernel scritto in html.
    Originariamente inviato da rnlflame
    Comunque non dovevano crollare

  4. #4
    Utente di HTML.it L'avatar di Aires
    Registrato dal
    Jan 2010
    Messaggi
    725
    Up

    Allora punto della situazione, il primo problema è stato risolto e la query finale che uso è la seguente:

    codice:
    Select sec_to_time(Avg(tempo)) as tempomedio From 
      (Select Sum(t.tempo_accumulato) as tempo 
       From tempi t, interventi i Where t.intervento=i.id 
       And ... (vari parametri sulle date)...
       Group by t.intervento) as t
    Ora ho la necessita di integrare la seguente cosa:

    Fare il conteggio nel caso la priorità sia 1, poi 2, poi 3.

    Purtroppo non è così semplice la cosa perchè la priorità per estrapolarla devo usare la seguente query:

    codice:
    Select intervento, priorita from tempi where id in
    (select * from (select min(id) as id from tempi group by intervento) as tab) 
    group by intervento
    Quindi come vedete per esserci le 2 query ci sono, il grosso del problema è come unirle/integrarle.


    Specifico nel caso serva che il campo priorita contenente (1/2/3) si trova nella tabella tempi.

    Ringrazio chiunque riesca a dare qualche consiglio o una mano.
    Grazie a tutti
    Originariamente inviato da qazar
    Se finisci di leggere il thread mi sono corretto,è solo i kernel scritto in html.
    Originariamente inviato da rnlflame
    Comunque non dovevano crollare

  5. #5
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Posta un dump delle due tabelle popolate con qualche record e il risultato che vorresti ottenere.

  6. #6
    Utente di HTML.it L'avatar di Aires
    Registrato dal
    Jan 2010
    Messaggi
    725
    Ok

    Edit: in realtà le tabelle sono tempi e interventi, però la tabella interventi mi serve solo per controllare che un campo sia settato in un certo modo, quindi non serve per realizzare la query, basta solo sapere che comunque c'è una join sui seguenti campi

    tempi.intervento = intervento.id

    Spiego meglio: nella tabella interventi ho un certo id macchina che devo escludere dai risultati della query, quindi faccio la join e specifico di non prendere in considerazione quell'id macchina (ma questo riesco già a farlo)


    Allllora
    codice:
    Tabella: tempi 
    ID - Intervento - Priorita - tempo_acccumulato
    01 -    250       -     1    -    50
    02 -    300       -     2    -    70
    03 -    250       -     1    -    10
    04 -    250       -     1    -    5
    05 -    400       -     1    -    150
    06 -    100       -     2    -    450
    07 -    250       -     2    -    00
    08 -    300       -     2    -    15
    09 -    100       -     3    -    5
    Bene allora premessa:
    Come si vede abbiamo gli interventi 100, 250, 300, 400.
    codice:
    L'intervento:
     100 viene aperto con priorità 2(tempo totale per intervento 455)
     250 viene aperto con priorità 1(tempo totale per intervento 65)
     300 viene aperto con priorità 2(tempo totale per intervento 85)
     400 viene aperto con priorità 1(tempo totale per intervento 150)
    Bene allora ogni intervento verrà suddiviso a seconda della prima priorità che gli è stata assegnata, quindi quando effettuo la query del tempo medio per gli interventi con priorità 1 voglio che questa vada a toccare l'intervento 250 e l'intervento 400
    codice:
    Quindi risposta da ottenere:
    Priorità 1 -> tempo medio = 107 (215/2) :D
    Mi basta una query perchè poi la copio e metto where priorità = 2 e poi where priorità = 3 facendo 3 query distinte.

    Come detto sopra abbiamo la query pronta per il calcolo del tempo medio e quella per estrapolare la prima priorità per ogni intervento.

    Spero si riesca a realizzare
    Grazie mille comunque a tutti
    Originariamente inviato da qazar
    Se finisci di leggere il thread mi sono corretto,è solo i kernel scritto in html.
    Originariamente inviato da rnlflame
    Comunque non dovevano crollare

  7. #7
    ma non ti basta aggiungere la where priorita=x quando interroghi la tabella tempi?

  8. #8
    Utente di HTML.it L'avatar di Aires
    Registrato dal
    Jan 2010
    Messaggi
    725
    Originariamente inviato da optime
    ma non ti basta aggiungere la where priorita=x quando interroghi la tabella tempi?
    Magari

    Purtroppo devo prendere per ogni intervento la prima priorità e per farlo devo usare questa query:
    codice:
    Select intervento, priorita from tempi 
    where id in (select * from (select min(id) as id from tempi group by intervento) as tab) 
    group by intervento
    Che va integrata a quella per il calcolo del tempo medio.


    Ti spiego se l'intervento 1 nella tabella tempi ha id 1 priorita 1, id 5 priorita 2, selezionando solo where priorita = 1 calcolerebbe solo il tempo dell'id 1.
    Mentre selezionando l'intervento, facendo la somma ed attribuendolo per tutta la sua composizione alla priorità 1 ottengo il risultato sperato
    Originariamente inviato da qazar
    Se finisci di leggere il thread mi sono corretto,è solo i kernel scritto in html.
    Originariamente inviato da rnlflame
    Comunque non dovevano crollare

  9. #9
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Fai le opportune verifiche perchè adesso non ho modo di testarla per bene.

    codice:
    select tab2.priorita,avg(tab3.ti) as tmedio
    from
    (select min(id) as id from tempi
    group by intervento) as tab1
    left join tempi as tab2 on tab1.id = tab2.id
    inner join
    (
    select intervento,sum(tempo_accumulato) as ti
    from tempi
    group by intervento) as tab3
    on tab2.intervento = tab3.intervento
    group by tab2.priorita

  10. #10
    Utente di HTML.it L'avatar di Aires
    Registrato dal
    Jan 2010
    Messaggi
    725
    Ok grazie mille ora la testo, unico problema dovrò ottimizzarla per bene per ridurre i tempi (sta attorno al minuto). Comunque provo un po e vi faccio sapere. Grazie mille
    Originariamente inviato da qazar
    Se finisci di leggere il thread mi sono corretto,è solo i kernel scritto in html.
    Originariamente inviato da rnlflame
    Comunque non dovevano crollare

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.