我是MySQL的新手,我正在开发一个查询,该查询应该将一个表中的列中的数据除以另一个表中的列中的数据。我在网站周围进行了很好的搜索,但找不到我正在寻找的东西(或者我可能缺乏理解)。我希望将TotalSpend除以TotalHires并认为我非常接近,但这并不完全正确。
我在每列中有4行数据,我正在寻找要执行的4个计算。目前正在返回16个结果。我只希望划分与同一成员id相关的数据,但认为一列中的每个单元格被另一列中的每个单元格划分。 如何更改我的代码以仅返回所需的4个计算?
总支出:
SELECT garment_hire_header.member_id, garment_hire_line.hire_id, SUM(garment_hire_line.days*catalogue.daily_rate) AS 'Total Spend'
FROM garment_hire_line
JOIN garment_hire_header ON garment_hire_line.hire_id = garment_hire_header.hire_id
JOIN garment ON garment_hire_line.garment_id = garment.garment_id
JOIN catalogue ON garment.catalogue_id = catalogue.catalogue_id
Group by garment_hire_header.member_id
TotalHires:
SELECT garment_hire_header.member_id, COUNT(garment_hire_header.hire_id) as TotalHires
FROM garment_hire_header
Group by garment_hire_header.member_id
近乎工作的最终代码(返回16次计算):
SELECT s.TotalSpend / h.TotalHires
from (SELECT SUM(garment_hire_line.days*catalogue.daily_rate) AS TotalSpend
FROM garment_hire_line
JOIN garment_hire_header ON garment_hire_line.hire_id = garment_hire_header.hire_id
JOIN garment ON garment_hire_line.garment_id = garment.garment_id
JOIN catalogue ON garment.catalogue_id = catalogue.catalogue_id
Group by garment_hire_header.member_id) s CROSS JOIN
(SELECT COUNT(garment_hire_header.hire_id) as TotalHires
FROM garment_hire_header
Group by garment_hire_header.member_id) h
现在,这是有效的,我正试图进一步推动它。如果在另一个查询中找到hire_id,我只想显示数据
我已尝试添加以下在过去针对不同查询工作的内容但由于某种原因在这种情况下不起作用:
WHERE garment_hire_line.hire_id IN
(SELECT hire_id, DATE_ADD(date_out, INTERVAL (days) DAY) AS 'Expected Return', DATEDIFF(return_date, DATE_ADD(date_out, INTERVAL (days) DAY)) as 'Days Late'
FROM garment_hire_line
WHERE DATEDIFF(return_date, DATE_ADD(date_out, INTERVAL (days) DAY)) > 0
ORDER BY hire_id)
答案 0 :(得分:0)
只需将cross join
更改为left join
,然后添加member_id
以匹配表格,即可解决此问题。但是,对这种情况有一个更好的方法:
SELECT garment_hire_header.member_id, garment_hire_line.hire_id,
SUM(garment_hire_line.days*catalogue.daily_rate) AS 'Total Spend',
SQ1.TotalHires,
SUM(garment_hire_line.days*catalogue.daily_rate)/SQ1.TotalHires AS `Total`
FROM garment_hire_line
LEFT JOIN garment_hire_header ON garment_hire_line.hire_id =
garment_hire_header.hire_id
LEFT JOIN garment ON garment_hire_line.garment_id = garment.garment_id
LEFT JOIN catalogue ON garment.catalogue_id = catalogue.catalogue_id
LEFT JOIN (SELECT garment_hire_header.member_id,
COUNT(garment_hire_header.hire_id) as TotalHires
FROM garment_hire_header
Group by garment_hire_header.member_id) AS SQ1 ON SQ1.member_id =
garment_hire_header.member_id
Group by garment_hire_header.member_id;
我尽可能地保留了您的初始代码。关键点在于,当您使用相同的表进行计算时,您不需要将所有内容放入子查询中。我还将您的joins
重命名为left joins
,这不会改变查询的工作方式,但指定您正在进行的联接类型会更好。