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 仅包含所选员工的销售额,然后您可以对其取平均值。
我在编写 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 仅包含所选员工的销售额,然后您可以对其取平均值。