【问题标题】:How to get average sales of an employee before certain sale in MySQL?如何在 MySQL 中特定销售之前获得员工的平均销售额?
【发布时间】:2014-10-13 12:39:16
【问题描述】:
假设我有一个包含 3 列的表:EMPLOYEE_ID, NUM_SALES, DATE。简单地说,这是表示每日销售额的员工表。对于表中的每一行,我尝试计算它;该 EMPLOYEE_ID 在过去 K 天内(不包括今天)的平均销售额。
如何在 MySQL 中查询?我尝试使用 EMPLOYEE_ID 和 DATE 进行分组,但我不知道如何找到每行的最后 K 个销售额。
【问题讨论】:
标签:
mysql
sql
database
datetime
【解决方案1】:
要选择天的间隔,可以使用MySQL的DATE_SUB()函数:
WHERE `date` >= DATE_SUB(NOW(), INTERVAL 3 DAY)
这将选择过去 3 天的所有记录。但是,要从中排除“今天”:
WHERE `date` BETWEEN
DATE_SUB(NOW(), INTERVAL 3 DAY)
AND DATE_SUB(NOW(), INTERVAL 1 DAY)
之后,您应该能够GROUP BY employee_id 获得您想要的东西:
SELECT
employee_id, avg(num_sales) AS avg_num_sales
FROM
employee_table
WHERE `date` BETWEEN
DATE_SUB(NOW(), INTERVAL 3 DAY)
AND DATE_SUB(NOW(), INTERVAL 1 DAY)
GROUP BY
employee_id
【解决方案2】:
您需要能够从表中选择项目,我们称之为dailysale,按日期。
这就是你要做的。
SELECT employee_id, AVG(num_sales) AS avg_sales
FROM dailysale
WHERE date >= CURDATE() - INTERVAL 3 DAY
AND date < CURDATE()
GROUP BY employee_id
这使用两个WHERE 子句来筛选您正在使用的日期范围。 date >= CURDATE() - INTERVAL 3 DAY 排除三天前午夜之前的所有记录,date < CURDATE() 排除今天午夜或之后的所有记录。
您需要使用CURDATE() 而不是NOW(),因为NOW() 包含日期和当前时间。 date < NOW() 将包括今天的销售额,因为您的 date 列只记录日期而不记录时间。
如果您想按销售顺序列出员工,您可以添加
ORDER BY AVG(num_sales) DESC, employee_id
到查询。