5

このクエリは私を困惑させました...私は今日、ウェブの仕事を1日かけて検索し、多くのことを試しました。

データベースから各曜日の平均注文数を取得したいと考えています。COUNT で合計 # を取得できます。しかし、GROUP BY で COUNT の AVG を取得する方法がわかりません。私はサブクエリを試しました...関数...すべて...何も機能しません...誰かが私に骨を投げることができるかもしれません。

以下は、私が始めたクエリです。AVG(COUNT(*)) が機能しないことはわかっていますが、やりたいことを示しているのでそのままにしておきます。

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
4

4 に答える 4

9

毎日の総計を必要としない平均を取得するには、毎日複数の毎日の合計が必要です。

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

次に、それらの数を平均することができます。つまり、月曜日は(5 + 6)/2です。
このようなものが機能するはずです:

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

更新:私はもともと間違っていました。内側のSELECTを実際の日付でグループ化して、正しい1日の合計を取得します。たとえば、月曜日(2/1/10)と月曜日(2/8/10)に発生した注文の数を個別に取得する必要があります。次に、それらの合計を曜日ごとに平均します。

于 2010-02-09T20:03:22.880 に答える
1

orフィールドでorder_timeあると仮定すると、これで十分です (誰もがこの方法で幸せになるでしょう ;) )。もちろん、最も古い順序は金曜日に、最も新しい順序は月曜日になる可能性があるため、ある程度の概算があります。そのため、毎日の曜日の量は等しくありませんが、曜日ごとに個別の変数を作成するのは面倒です。とにかく、今のところ役に立てば幸いです。datedatetime

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)
于 2010-02-09T19:55:39.187 に答える
1

これが古いことは知っていますが、他の誰かが使用したものを見つけたいと思って、同様の解決策を探していました。サブクエリを実行しないことを期待して、私は以下を思いつきました。フィードバックがあれば幸いです!

SELECT dayofweek(`timestamp`) as 'Day',count(`OrderID`)/count(DISTINCT day(`timestamp`)) as 'Average' FROM  `Data` GROUP BY dayofweek(`timestamp`)

アイデアは、特定の曜日の合計注文数を「月曜日」の合計数またはその曜日で割ることです。これが説明していないのは、注文がゼロの日でも平均が下がらないということです。アプリケーションによっては、それが必要な場合とそうでない場合があります。

于 2014-11-11T02:39:43.970 に答える
0

あなたが求めていることは私には意味がありません... AVG は集計関数であり、COUNT もそうです。上記のクエリの何が問題なのですか? COUNT(*) AS avgorders?

day1 に 3 行、day2 に 2 行、day3 に 5 行、day4 に 9 行があったとします。

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

単一のクエリでそれを取得できるとは思いません。最初の集計の結果を処理する PHP などのサーバー側言語で 2 回目の集計を行う方がよいでしょう。

于 2010-02-09T18:54:13.700 に答える