Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 20

Discussione: Medie Tra Record

  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2003
    Messaggi
    191

    Medie Tra Record

    Sto impazzendo col seguente problema,
    nel database ho i seguenti campi
    matite rosse
    matite verdi
    matite blu
    totale (campo vuoto)
    devo fare la media di quante matite compra un utente e ordinare gli utenti in base a chi ha acquistato più matite.
    Il fatto è che non è detto che l'utente acquisti matite di tutti i colori, così la media deve essere fatta solo tra 1, 2 o 3 in base a quante matite di colore diverso vengono comprate.
    Con SUM o AVG riesco a fare la media, ma non trovo la maniera di ordinare in base al numero di media + alto... qualcuno mi aiuta????? grazie

    SELECT * FROM acquisti GROUP BY acquirente ORDER BY totale DESC

    <?php
    if($row_Rs_dub['rosse']==""){
    $row_Rs_dub['totale']= ($row_Rs_dub['verdi']+$row_Rs_dub['blu'])/2;
    echo ($totale);}
    if($row_Rs_dub['blu']==""){
    $row_Rs_dub['totale']= ($row_Rs_dub['verdi']+$row_Rs_dub['rosse'])/2;
    echo ($totale);}
    if($row_Rs_dub['verdi']==""){
    $row_Rs_dub['totale']= ($row_Rs_dub['rosse']+$row_Rs_dub['blu'])/2;
    echo ($totale);}
    else
    $row_Rs_dub['totale']= ($row_Rs_dub['rosse']+$row_Rs_dub['verdi']+$row_Rs_dub['blu'])/3;
    eecho ($totale);?>
    GRAZIEEEEE!!!!!!!

  2. #2
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Devi settare a 0 i campi per i quali non vengono acquistate matite.
    Gli if servono per verificare se almeno una matita di ciascun colore è stata venduta.
    Quindi il totale viene diviso per 1, per 2 o per 3 a seconda di quanti colori diversi sono presenti nell'acquisto.

    codice:
    select acquirente,sum(rosse) as tot_rosse,sum(verdi) as tot_verdi,sum(blu) as tot_blu,
    sum(rosse) + sum(verdi) + sum(blu) as totale,
    (sum(rosse) + sum(verdi) + sum(blu) ) / 
    (
    (if (sum(rosse) <> 0,1,0)) +
    (if (sum(verdi) <> 0,1,0)) + 
    (if (sum(blu) <> 0,1,0))
    ) as media
    from acquisti
    group by acquirente
    order by media desc
    Il campo totale è un campo calcolato. Lo devi togliere dalla struttura della tua tabella e lo calcoli quando vuoi tramite query come ho fatto nella query qui sopra.

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2003
    Messaggi
    191
    grazie mille, sei un tesorone, ho risolto alla grande!!!!
    Baci baci

  4. #4
    Utente di HTML.it
    Registrato dal
    Nov 2003
    Messaggi
    191
    senti e se un acquirente acquista più di una volta in giorni diversi, la media poi non mi viene più? come mai?

  5. #5
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Originariamente inviato da Alyssa
    senti e se un acquirente acquista più di una volta in giorni diversi, la media poi non mi viene più? come mai?
    Questa è la prova che ho fatto
    codice:
    acquir rosse verdi blu
    1       10  0 0
    1       3   2 3
    2      20  0  0
    2       1    0  2
    3       4   0   0
    la query restituisce
    codice:
    acquir tot_rosse  tot_verdi   tot_blu totale media
    2          21             0             2        23   11.5      // media = totale diviso 2
    1          13             2             3        18      6                      totale diviso 3
    3           4              0             0         4      4                       totale diviso 1
    Mi sembra funzioni correttamente.

  6. #6
    Utente di HTML.it
    Registrato dal
    Nov 2003
    Messaggi
    191
    Ciao.... scusa hai ragione , ma mi son spiegata male io.
    Quello che volevo ottenere è il seguente
    utente 1 Acquisto numero 1 = media del 6
    utente 1 Acquisto numero 2 = media dell'8
    Media tra i 2 acquisti =7
    cioè ottenere la media delle 2 medie...
    Che rottura che sono!!!!
    mi puoi dare un'ennesima dritta?
    grazie in anticipo!!!!

  7. #7
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    codice:
    select acquirente,
    sum(rosse)+sum(verdi)+sum(blu) as totale,
    (sum(rosse)+sum(verdi)+sum(blu) ) / count(acquirente) as media,
    avg(rosse) as media_rosse,avg(verdi) as media_verdi,avg(blu) as media_blu,
    count(acquirente) as numero_acquisti
    from acquisti
    group by acquirente
    order by acquirente

  8. #8
    Utente di HTML.it
    Registrato dal
    Nov 2003
    Messaggi
    191
    non mi torna il conto uguale...

  9. #9
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Originariamente inviato da Alyssa
    non mi torna il conto uguale...

    Magari se scrivi qualche record di esempio e ciò che vuoi ottenere ne veniamo a capo.

  10. #10
    Utente di HTML.it
    Registrato dal
    Nov 2003
    Messaggi
    191
    la prima parte che mi hai mandato va benissimo perchè riguarda gli acquisti di un giorno per cliente.
    il problema è quando devo fare la media degli acquisti globali,
    ogni giorno ha una media, e io vorrei solo riuscire non a sommarle ma a fare un'ulteriore media.
    con un'altra select pescare l'id della giornata con le relative medie degli acquisti e fare la media tra quelle estratte...

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.