0

そのため、一連の注文項目を保持するテーブルがあります。注文項目テーブルは、特定の注文に含まれる特定の項目の数を追跡します。以下は、この例で使用するテーブルの簡易版です。

注文商品表

order_item_id : int
order_item_item_id : int
order_item_quantity : int
order_item_order_id : int

注文表

order_id : int
order_date : date

特定の order_item_item_id の売上を週ごと、月ごと、および常に平均する単一のクエリを実行しようとしています。

現在、私のクエリは次のとおりです

SELECT totalAvg.item 

ROUND(AVG(totalAvg.total)+0.4999999, 0) AS totalAverage,  
ROUND(AVG(monthAvg.total)+0.4999999, 0) AS monthAverage, 
ROUND(AVG(weekAvg.total)+0.4999999, 0) AS weekAverage from

(SELECT orderitem.order_item_item_id AS item, SUM(orderitem.order_item_quantity) AS total,
 DATE(`order`.order_date) AS date FROM orderitem, `order` WHERE orderitem.order_item_order_id = 
`order`.order_id GROUP BY DATE(`order`.order_date), order_item_item_id) AS totalAvg,

(SELECT orderitem.order_item_item_id AS item, SUM(orderitem.order_item_quantity) AS total, 
DATE(`order`.order_date) AS date FROM orderitem, `order` WHERE orderitem.order_item_order_id =
`order`.order_id AND `order`.order_date > date_sub(now(), interval 1 week) GROUP BY 
DATE(`order`.order_date), order_item_item_id) AS weekAvg,

(SELECT orderitem.order_item_item_id AS item, SUM(orderitem.order_item_quantity) AS total,
DATE(`order`.order_date) AS date FROM orderitem, `order` WHERE orderitem.order_item_order_id = 
`order`.order_id AND `order`.order_date > date_sub(now(), interval 1 month) GROUP BY 
DATE(`order`.order_date), order_item_item_id) AS monthAvg,

WHERE totalAvg.item = monthAvg.item AND
monthAvg.item = weekAvg.item 
GROUP BY item

これの問題は、アイテムが weekAvg テーブルに存在しない場合、totalAvg または monthAvg の結果が出力されないことです。単一のステートメント内でこれを行うにはどうすればよいですか?

サンプルデータ

{order_id : 5, order_date : 02/02/2013}
{order_id : 6, order_date : 13/03/2013}

{order_item_id : 1, order_item_order_id : 5, order_item_item_id : 1, order_item_quantity : 3}
{order_item_id : 2, order_item_order_id : 6, order_item_item_id : 1, order_item_quantity : 4}

週次レポートには ID 1 の注文項目のエントリがないため、現在の出力は何も返しません。次のように出力されるように、これを回避しようとしています。

totalAverage = 3.5
monthAverage = 4
weekAverage = 0

値は次のように計算されます。

合計平均 = 販売された特定のアイテムの合計数を、そのアイテムが販売された日数で割ったもの。

月と週の値は前の計算と同じですが、時間制限があるため、注文は最後の週/月内に行われた必要があります。

4

1 に答える 1

0

totalAvg を monthAvg および weekAvg に接続するには、外部結合を使用する必要があります。COALESCE()空の週または月の値に対して NULL ではなく 0 を取得するために使用できます。

ANSI 結合構文も使用する必要があります。エラーが発生しにくく、読みやすくなっています。

次のようなことを試してください:

SELECT totalAvg.item,
ROUND(AVG(totalAvg.total)+0.4999999, 0) AS totalAverage,  
COALESCE(ROUND(AVG(monthAvg.total)+0.4999999, 0),0) AS monthAverage, 
COALESCE(ROUND(AVG(weekAvg.total)+0.4999999, 0),) AS weekAverage 
from
(
  SELECT orderitem.order_item_item_id AS item, 
    SUM(orderitem.order_item_quantity) AS total,
    DATE(`order`.order_date) AS date 
  FROM orderitem
    inner join `order` on orderitem.order_item_order_id = `order`.order_id 
  GROUP BY DATE(`order`.order_date), order_item_item_id
) AS totalAvg
left outer join
(
  SELECT orderitem.order_item_item_id AS item, 
    SUM(orderitem.order_item_quantity) AS total, 
    DATE(`order`.order_date) AS date 
  FROM orderitem
    inner join `order` on orderitem.order_item_order_id = `order`.order_id 
  WHERE `order`.order_date > date_sub(now(), interval 1 week) 
  GROUP BY 
  DATE(`order`.order_date), order_item_item_id
) AS weekAvg on weekAvg.item = totalAvg.item
left outer join
(
  SELECT orderitem.order_item_item_id AS item, 
    SUM(orderitem.order_item_quantity) AS total,
    DATE(`order`.order_date) AS date 
  FROM orderitem
    inner join `order` on orderitem.order_item_order_id = `order`.order_id 
  WHERE `order`.order_date > date_sub(now(), interval 1 month) 
  GROUP BY DATE(`order`.order_date), order_item_item_id
) AS monthAvg on monthAvg.item = totalAvg.item
GROUP BY item
于 2013-03-28T01:43:45.487 に答える