使用mysql返回给定月份每个客户的订单数量和平均支出
我的数据库中有具有架构的表:使用mysql返回给定月份每个客户的订单数量和平均支出,mysql,database,average,arithmetic-expressions,Mysql,Database,Average,Arithmetic Expressions,我的数据库中有具有架构的表: customers (customerID: integer, fName: string, lName: string) items (itemID: integer, description: string, price: integer) orders (orderID: integer, itemID: integer, aID: integer, customerID: integer, date: date) 对于每位客户,我想返回customerID
customers (customerID: integer, fName: string, lName: string)
items (itemID: integer, description: string, price: integer)
orders (orderID: integer, itemID: integer, aID: integer, customerID: integer, date: date)
对于每位客户,我想返回customerID、订单数量和客户在2013年3月期间的平均花费金额(每个客户/订单在3月份的总花费)。这包括所有客户,无论他们是否在3月份实际购买了东西
我尝试过使用join和其他函数,但没有成功。
任何帮助都将不胜感激。
谢谢 选择
c、 客户ID,
将(不同的o.orderID)计数为订单的数量,
总和(i.price)/计数(不同的o.orderID)作为我的平均值
从…起
顾客c
o.customerID=c.customerID和o.date>='2013-03-01'和o.date<'2013-04-01'上的左连接订单o
o.itemID=i.itemID上的左连接项i
按c.customerID分组
我在COUNT()函数中使用了DISTINCT,因为每个订单可能有多个项目。我不知道你的数据。即使情况并非如此,COUNT(*)
和COUNT(无论什么列)
之间也存在差异。第一个对每一行进行计数,后一个仅对该列中不为NULL的行进行计数
您必须使用LEFT JOIN,因为您希望拥有每个客户,无论是否有该客户的订单
订单的过滤条件(仅限2013年3月的订单)处于联接条件中,因为将其放入WHERE子句将有效地将左侧联接转换为内部联接(这样,您将只获得在2013年3月也订购了某些产品的客户)。或者,您必须使用或o.orderID扩展WHERE条件为NULL
还有问题吗?太好了!谢谢你,它工作得很好@fancyPantshow使用ifnull函数,这样,如果客户没有订购任何东西,平均支出返回0.00@幻想者
SELECT
c.customerID,
COUNT(DISTINCT o.orderID) AS number_of_orders,
SUM(i.price) / COUNT(DISTINCT o.orderID) AS my_average
FROM
customers c
LEFT JOIN orders o ON o.customerID = c.customerID AND o.date >= '2013-03-01' AND o.date < '2013-04-01'
LEFT JOIN items i ON o.itemID = i.itemID
GROUP BY c.customerID