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、顧客ごとの注文数、顧客ごとの平均支出の 3 つの値を返します。現在のコードでは、顧客ごとの平均支出は空白 (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 では、最初のエントリは 2 桁の精度で返されますが、SQLFiddle では返されないため、ステートメントには 2 つのエントリがあります。FORMAT必要に応じて、小数点以下 2 桁の精度を強制する構文を含む 2 番目のエントリを追加しました。

于 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 に答える