MySQL子查询在同一个表上

时间:2016-04-18 18:32:42

标签: 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_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
   ---------+------------+--------------+----------------

2 个答案:

答案 0 :(得分:3)

我使用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,当天的平均销售额和当天的员工平均销售额。您可能希望按照自己喜欢的方式订购它,限制日期和其他事项。

答案 1 :(得分:0)

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

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;

所以基本上这会创建一个第二个表格,其中只包含所选员工的销售额,然后您可以对其进行平均。