Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 有没有办法用case函数显示负值?_Mysql_Date_Join_Average_Window Functions - Fatal编程技术网

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

Mysql 有没有办法用case函数显示负值?,mysql,date,join,average,window-functions,Mysql,Date,Join,Average,Window Functions,问题: 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_P

问题:

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;
提供一份报告,显示客户的全名(包括名字和姓氏)、农舍名称、农舍地区名称、预订日期(格式为2017年12月15日)、预订价格以及该农舍的预订价格与所有农舍的平均预订价格之间的差额(以$yy.y.e.g.$25.6格式截断至小数点后1位),按全名降序排列

我的答案:

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;
选择CONCAT(客户名称,”,客户名称)作为“名称”,小屋名称,区域名称,
日期格式(预订日期,“%D%M%Y”)为“预订日期”,预订价格,
案例
当平均(预订价格)<预订价格,然后预订价格-平均(预订价格)
ELSE-1*(平均(预订价格)-预订价格)
以“与平均值的差异”结尾
来自客户
使用(客户ID)加入预订
加入农舍
连接区域
按名称分组;
我的产出:

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

我的问题:是否有人知道当显示负值时,可以执行与情况相同的功能

SQLFIDLE(包含数据和所有必要的文件):

ERD:

问题的提示:


您的查询没有正确聚合,尽管MySQL的编译不够宽松

如果您运行的是MySQL 8.0,则可以使用窗口函数:

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(??)
在早期版本中,您可以使用aggregarte查询来计算总体平均值:

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
旁注:

  • 我添加了表别名,并尝试在列前面加上相关表的前缀-您可能需要检查一下

  • 您在
    区域


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

但是根本没有必要提出你的理由

最好使用正确的连接和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             $0.0
Charlie Oscar   Atlantic Beach Resort Cottage 1     Halifax         15th January 2018   1176            $294.0
Eve Evenfield   Atlantic Beach Resort Cottage 1     Halifax         22nd December 2017  654             $0.0
Frank Mitchell  Atlantic Beach Resort Cottage 1     Halifax         15th January 2018   384             $0.0
Grace Damon     Atlantic Beach Resort Cottage 1     Halifax         1st January 2018    170             $0.0
Student DalFCS  Atlantic Beach Resort Cottage 1     Halifax         15th January 2018   584             $154.5

在这种问题中是否需要别名?为什么区域上的联接需要一个条件?只要查询中涉及多个表,别名就很有用-为列添加前缀可以明确它们来自哪个表(并避免名称冲突)。至于
区域
:您需要一个联接条件来反映
预订
区域
之间的关系,否则您将得到两个表行的笛卡尔乘积。问题说明“所有别墅的平均预订价格”我有点困惑,因为问题暗示我将发布为edit1我解决问题的技巧是写一些可以工作到某些列的东西,然后一点一点地实现一些代码。我改变了它是否适合问题。我删除了平均值,因为我添加了它来证明答案。现在ot显示了dolar符号,并将t四舍五入他的成绩是1位数。