有没有办法用 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
问题:
提供一份报告,显示客户的全名(名字和姓氏一起)、小屋名称、小屋的地区名称、预订日期(格式为 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