有没有办法用 case 函数显示负值?

Is there a way to display negative values with the case function?

问题:

提供一份报告,显示客户的全名(名字和姓氏一起)、小屋名称、小屋的地区名称、预订日期(格式为 2017 年 12 月 15 日)、预订价格,以及该小屋的预订价格与所有小屋的平均预订价格之间的差额(以 $yy.y 的格式截断到最接近的小数点后一位,例如 $25.6),按全名降序排列。

我的回答:

SELECT CONCAT(Customer_FName," ",Customer_LName) AS 'Name', Cottage_Name, Region_Name, 
DATE_FORMAT(Booking_Date,"%D %M %Y" ) AS 'Date Booked', Booking_Price,
CASE 
    WHEN AVG(Booking_Price) < Booking_Price THEN Booking_Price - AVG(Booking_Price)
    ELSE -1 * (AVG(Booking_Price) - Booking_Price)
END AS 'Diff From Average'

FROM Customer

JOIN Booking USING(Customer_ID)
JOIN Cottage
JOIN Region
GROUP BY Name;

我的输出:

所需的输出必须显示负值而不是 0

我的问题:有谁知道一个函数可以和 CASE... WHEN 一样并显示负值?

SQLFiddle(包含数据和所有必要的文件):http://sqlfiddle.com/#!9/8a40db/2/0

ERD:

问题提示:

您的查询未正确聚合,尽管 MySQL 足够宽松以编译它。

如果你是 运行 MySQL 8.0 你可以用 window 函数来完成:

select
    concat(c.Customer_FName, ' ', c.Customer_LName) AS Name, 
    b.Cottage_Name, 
    r.Region_Name, 
    DATE_FORMAT(Booking_Date,"%D %M %Y" ) AS Date_Booked, 
    b.Booking_Price,
    AVG(b.Booking_Price) OVER() - Booking_Price diff_from_average
from customer c
inner join booking b using(customer_id)
inner join region r using(??)

在早期版本中,您可以使用聚合查询来计算总体平均值:

select
    concat(c.Customer_FName, ' ', c.Customer_LName) AS Name, 
    b.Cottage_Name, 
    r.Region_Name, 
    date_format(Booking_Date,"%D %M %Y" ) AS Date_Booked, 
    b.Booking_Price,
    a.avg_booking_Price - Booking_Price diff_from_average
from customer c
inner join booking b using(customer_id)
inner join region r using(??)
cross join (select avg(booking_price) avg_booking_price from booking) a

旁注:

  • 我添加了 table 别名并尝试在列前添加相关 table - 您可能需要查看

  • 您在 region

  • 上缺少连接条件

只有零个,因为平均价格与预订价格相同

但是完全没有必要提出你的理由

你最好在 ON clqause 中使用正确的连接

SELECT 
    CONCAT(Customer_FName," ",Customer_LName) AS 'Name'
    , Cottage_Name
     , Region_Name, 
     DATE_FORMAT(Booking_Date,"%D %M %Y" ) AS 'Date Booked'
    , Booking_Price
    ,
    CONCAT('$',ROUND((Booking_Price - AVG(Booking_Price)),1)) AS 'Diff From Average'
FROM Customer
    JOIN Booking USING(Customer_ID)
    JOIN Cottage
   JOIN Region
GROUP BY Name;



Name            Cottage_Name                        Region_Name     Date Booked         Booking_Price   Diff From Average
Bob Perkins     Atlantic Beach Resort Cottage 1     Halifax         10th January 2018   144             [=10=].0
Charlie Oscar   Atlantic Beach Resort Cottage 1     Halifax         15th January 2018   1176            4.0
Eve Evenfield   Atlantic Beach Resort Cottage 1     Halifax         22nd December 2017  654             [=10=].0
Frank Mitchell  Atlantic Beach Resort Cottage 1     Halifax         15th January 2018   384             [=10=].0
Grace Damon     Atlantic Beach Resort Cottage 1     Halifax         1st January 2018    170             [=10=].0
Student DalFCS  Atlantic Beach Resort Cottage 1     Halifax         15th January 2018   584             4.5