2013-03-28 59 views
0

因此,我有一个表格,其中包含一组订购商品,订购商品表格记录特定订单中包含的特定商品的数量。以下是该示例中使用的表格的简化版本。MySQL显示总和0

订单项目表

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

Order表

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.我试图解决这个问题的条目,从而它将woudl输出下面

totalAverage = 3.5 
monthAverage = 4 
weekAverage = 0 

的值被计算如下:

总平均=总NUM销售特定商品的销售额除以销售商品的天数。

月份和星期值与先前的计算值相同,但具有时间限制,因此订单必须放置在最后一周/月内。

回答

0

您需要使用outer joins才能将totalAvg连接到monthAvg和weekAvg。你可以使用COALESCE()来确保你得到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 
+0

非常感谢,我现在试试这个。 – 2013-03-28 21:13:33

+0

我觉得我很困惑,可能是因为我去了一个臃肿(尽管减少)的例子。现在我试图把它放到实际的版本中,并试图弄清楚你已经做了什么,但是不能让它起作用。你能否展示一个Coallese,内连接和左外连接的例子,同时解释它的作用/工作原理?我为了我的生活无法解决这个问题,至少可以说是令人沮丧:P – 2013-03-28 21:37:01