使用 IFNULL 函数 mysql 将 null 设置为零
Using IFNULL function mysql to set null to zero
我的数据库中有具有以下架构的表:
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
其中 returns 三个值:客户 ID、每个客户的订单数量和每个客户的平均支出。
使用现在的代码,每个客户的平均支出返回为空白 (null)。
如果客户在 2013 年 3 月没有订购任何东西(即,如果 3 月每个客户的订单数量为零),我无法使用 IFNULL 函数将每个客户的平均支出设置为 0.00。
任何帮助将不胜感激!
您的用例最好使用 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
没有看到你的 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
Returns: 0.00
我的语句中有两个 average
条目,因为在我的本地 MySQL Workbench 中,第一个 returns 具有两位小数精度但不在SQL小提琴。如果需要,我使用 FORMAT
语法添加了第二个条目以强制使用两位小数精度。
我的数据库中有具有以下架构的表:
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
其中 returns 三个值:客户 ID、每个客户的订单数量和每个客户的平均支出。 使用现在的代码,每个客户的平均支出返回为空白 (null)。 如果客户在 2013 年 3 月没有订购任何东西(即,如果 3 月每个客户的订单数量为零),我无法使用 IFNULL 函数将每个客户的平均支出设置为 0.00。 任何帮助将不胜感激!
您的用例最好使用 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
没有看到你的 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
Returns: 0.00
我的语句中有两个 average
条目,因为在我的本地 MySQL Workbench 中,第一个 returns 具有两位小数精度但不在SQL小提琴。如果需要,我使用 FORMAT
语法添加了第二个条目以强制使用两位小数精度。