MySQL 相同 table 的子查询

MySQL sub query on the same table

我在编写 MySQL 子查询时遇到问题。

SALES table 具有列名称:

sales_date | staff_id | sales_amount

记录每位员工的销售额。

我试图通过此查询实现的是 table,它显示所选员工的平均每日销售额以及所有员工的平均每日销售额。我只想显示所选员工有销售的天数。

SELECT staff_id, sales_date, AVG( sales_amount ) AS avgsales, sales_amount
FROM sales
GROUP BY sales_date
WHERE 
    (SELECT sales_date
    FROM sales
    WHERE staff_id = $staff_id) // this subquery shows all the dates that staff has records in

我希望它显示如下内容:

   Staff_id | Sales date | AverageSales | Employee_sales
   ---------+------------+--------------+----------------
   001      | 2016-04-18 | £2000        | £1800
   ---------+------------+--------------+----------------
   001      | 2016-04-17 | £3405        | £4000
   ---------+------------+--------------+----------------
   001      | 2016-04-16 | £1450        | £1400
   ---------+------------+--------------+----------------

我使用 Oracle,所以这个 MySQL SQL 中可能会有错字。但是,我希望它能正常工作...

您有两个概念:每个人每天的平均销售额和每个用户每天的平均销售额。您想将这两件事结合在一起。你可以轻松。

首先,你有每天的平均销售额。

select sales_date, avg(sales_amount) as averagesales
from sales
group by sales_date

现在,您需要每个用户每天的平均销售额。

select staff_id, sales_date, avg(sales_amount) as employeesales
from sales
group by sales_date, staff_id

你想要那些连在一起的。那很容易。

select * from (
  select sales_date, avg(sales_amount) as averagesales
  from sales
  group by sales_date
)a join (
  select staff_id, sales_date, avg(sales_amount) as employeesales
  from sales
  group by sales_date, staff_id
)b on a.sales_date=b.sales_date

这将在一次查询中为您提供 staff_id、sales_date、当天的平均销售额和当天的员工平均销售额。您可能希望按自己喜欢的方式订购、限制日期和其他事项。

您可以在查询中将 table 连接到自身,而不是使用子查询。试试这个:

SELECT sales.staff_id, sales.sales_date, AVG(sales.sales_amount), AVG(emp.sales_amount)
FROM sales
LEFT JOIN sales emp ON (emp.staff_id=$staff_id)
WHERE sales.staff_id=$staff_id
GROUP BY sales_date;

所以基本上这会创建第二个 table 仅包含所选员工的销售额,然后您可以对其取平均值。