同一表上的MySQL子查询

同一表上的MySQL子查询,mysql,subquery,Mysql,Subquery,我在编写MySQL子查询时遇到问题 SALES表的列名如下: sales_date | staff_id | sales_amount 记录每个员工的销售额 我试图通过此查询实现的是一个表,其中显示选定员工的平均每日销售额以及所有员工的平均每日销售额。我只想显示所选员工进行任何销售的天数 SELECT staff_id, sales_date, AVG( sales_amount ) AS avgsales, sales_amount FROM sales GROUP BY sales_dat

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

SALES表的列名如下:

sales_date | staff_id | sales_amount
记录每个员工的销售额

我试图通过此查询实现的是一个表,其中显示选定员工的平均每日销售额以及所有员工的平均每日销售额。我只想显示所选员工进行任何销售的天数

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

这将在一个查询中为您提供员工id、销售日期、当天的平均销售额和当天的员工平均销售额。您可能希望按自己喜欢的方式对其排序、限制日期以及其他事项。

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

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;

因此,本质上,这将创建第二个表,其中仅包含选定员工的销售额,然后可以对其进行平均。

这是一个老问题,但StackOverflow是一个永恒的资源。我认为这个问题只需要一个子查询就可以解决,但我想测试一下我的理论。请您不厌其烦地发布一个sqlfiddle链接,其中包含
sales
表和足够多的行,以供我播放?(如果您愿意,很高兴向上投票,因为SQLFIDLE链接总是为回答或研究类似问题的人增加sql问题的价值)非常感谢。更新后请用@ping我。