MySQL AVG (COUNT (*) - Hafta sorgu Gündüzleri Siparişler?

3 Cevap php

Bu sorgu ... bana şaşkın şimdi bir günden fazla web iş aradım ve ben çok şeyler denedim.

Benim db den haftanın her günü için siparişlerin avg numarası almak istiyorum. Ben sadece iyi COUNT ile toplam # indirebiliriz. Ama ben sadece bir grup tarafından üzerinde COUNT AVG nasıl anlamaya olamaz. Ben alt sorgular denedim ... fonksiyonlar ... her şey ... hiçbir şey belki birisi bana bir kemik atabilir ... çalışıyor.

İşte aşağıda ile başlayan sorgu. AVG (COUNT (*)) çalışmaz biliyorum ama ben ne yapmak istediğinizi gösteriyor çünkü ben o onu bırakacağım.

SELECT AVG(COUNT(*)) AS avgorders, SUM(total) AS ordertotal, DAYNAME(STR_TO_DATE(order_time,'%m/%d/%Y %H:%i')) AS day FROM data GROUP BY day ORDER BY DAYOFWEEK(STR_TO_DATE(order_time,'%m/%d/%Y %H:%i')) ASC

3 Cevap

Eğer her gün için genel toplamları gerekmez ortalama almak için, her gün için birden çok günlük toplamları gerekir.

  Day    |  Count
__________________
 Monday        5
 Tuesday       4
 Monday        6
 Tuesday       3
 ...          ...

Then you can average those numbers. I.e (5+6)/2 for Monday.
Something like this should work:

SELECT day_of_week, AVG(order_count) average_order FROM 
(
  SELECT DAYNAME(order_date) day_of_week, 
         DAYOFWEEK(order_date) day_num, 
         TO_DAYS(order_date) date,
         count(*) order_count
  FROM data 
  GROUP BY date
) temp
GROUP BY day_of_week 
ORDER BY day_num

GÜNCELLEME: Ben aslında yanlış oldu. Grup doğru günlük toplamları almak için gerçek tarih ile iç SEÇ. Örneğin, Pazartesi (2/1/10) ve Pazartesi (2/8/10) ayrı oldu kaç siparişleri almak gerekir. Sonra haftanın gün bu toplamları ortalama.

Bu order_time is date veya datetime alan (herkes ;) hapier bu şekilde olacağını) varsayarak, yapacağız. Tabii ki eski düzen Cuma ve Pazartesi yeni olabilir, çünkü bazı yaklaşım olduğunu, bu yüzden haftanın her günü miktarı eşit değil, haftanın her günü için ayrı bir değişken oluştururken eşek acı olacaktır. Neyse ben şimdi için yararlı olacağını umuyoruz.

SET @total_weeks = (
    SELECT
        TIMESTAMPDIFF(
            WEEK,
            MIN(order_time),
            MAX(order_time)
        )
     FROM data
    );

SELECT
    DAYNAME(order_time) AS day_of_week,
    ( COUNT(*) / @total_weeks ) AS avgorders,
    COUNT(*) AS total_orders
FROM 
    data
GROUP BY
    DAYOFWEEK(order_time)

Bana mantıklı gelmiyor ne soruyorsun ... AVG bir toplama işlevi ve böylece COUNT. Ne yukarıdaki sorgu ile yanlış ama sadece kullanmak: COUNT (*) AS avgorders?

... Sizi geri bildiren bir tek satır sonuç almak istiyorsun sen day1 için 3 satır, Day2 için 2 satır, Gün3 için 5 satır ve Gün4 için 9 satır vardı diyelim:

avgorders   = (3 + 2 + 2 + 5 + 9) / 5 = 21 / 5 = 4.2
ordertotal  = (3 + 2 + 2 + 5 + 9)              = 21

Ben tek bir sorguda o alabilirsiniz sanmıyorum, ve PHP ilk toplulaştırma sonuçlarına işletim gibi bir sunucu tarafı dili toplulaştırma ikinci tur yapıyor daha iyi olurdu.