【问题标题】: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 &gt;= CURDATE() - INTERVAL 3 DAY 排除三天前午夜之前的所有记录,date &lt; CURDATE() 排除今天午夜或之后的所有记录。

      您需要使用CURDATE() 而不是NOW(),因为NOW() 包含日期和当前时间。 date &lt; NOW() 将包括今天的销售额,因为您的 date 列只记录日期而不记录时间。

      如果您想按销售顺序列出员工,您可以添加

       ORDER BY AVG(num_sales) DESC, employee_id
      

      到查询。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多