0

我的数据库中有以下架构的表:

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)

和以下代码:

SELECT c.customerID, COUNT(DISTINCT o.orderID) AS number_of_orders, 
       ROUND(SUM(i.price) / COUNT(DISTINCT o.orderID),2) AS 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

它返回三个值:客户 ID、每位客户的订单数和每位客户的平均支出。使用现在的代码,每位客户的平均支出返回为空白 (null)。如果客户在 2013 年 3 月没有订购任何东西(即,如果 3 月每位客户的订单数量为零),我无法使用 IFNULL 函数将每位客户的平均支出设置为 0.00。任何帮助将不胜感激!

4

2 回答 2

0

没有看到你的IFNULL尝试,这个逻辑对我有用:

SELECT c.customerID, 
COUNT(DISTINCT o.orderID) AS number_of_orders, 
ROUND(IFNULL( (SUM(i.price) / COUNT(DISTINCT o.orderID)), 0.00),2) AS average,
FORMAT(IFNULL(ROUND( (SUM(i.price) / COUNT(DISTINCT o.orderID)),2), 0), 2) AS averageWithFormat 
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

回报:0.00

我的语句中有两个条目,average因为在我的本地 MySQL Workbench 中,第一个以两位小数精度返回,但在 SQLFiddle 中没有。如果需要,我使用语法添加了第二个条目FORMAT以强制两位小数精度。

于 2015-03-03T17:38:54.717 回答
0

您使用该IF()功能可能会更好。

SELECT c.customerID, COUNT(DISTINCT o.orderID) AS number_of_orders, 
       IF(COUNT(o.orderID) > 0,ROUND(SUM(i.price) / COUNT(DISTINCT o.orderID),2),0) AS 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
于 2015-03-03T17:27:48.460 回答