如何有选择地计算记录并在mysql中按日期对它们进行分组?

时间:2012-09-17 23:30:37

标签: mysql aggregate-functions

我有三个MySQL表:customers,persons和dates_d

customerspersons通过agent_code

相关联

dates_d只是一张表格,其中包含过去10年后的所有日期。

该密钥允许我确定每个人输入的客户数量。我还有另一个密钥,其中包含客户输入的日期,因此我可以查询数据库并查看每月,每年,每周等已输入的客户数量......

我目前的数据库样本包含去年八月的记录,如果我运行以下查询:

 SELECT COUNT(customers.hash) FROM customers
 LEFT JOIN persons ON persons.agent_code
 WHERE customers.agent_code = persons.agent_code
 GROUP BY customers.agent_code

它会告诉我每个代理商的客户数量。 但我需要知道有多少客户,每个代理进入当前周,并按天分组。

我知道并不是那么难,而且我或多或少地想到了一种让它发挥作用的方法:

  1. 加入dates_d和customers表
  2. 加入客户表和人员表。
  3. 按日期过滤信息,并按人分组。
  4. 所以我可以把它显示为:

    Thomas, Bryan:
    
    Monday 17: 20 customers
    Tuesday 18: 12 customers.
    Wednesday 19: 3 customers.
    Thursday 20: 0 customers

    等等。

    再一次,我一直在尝试不同的查询,但我无法从数据库中提出我需要的信息。我不是要求具体的查询,但是非常感谢任何帮助我指向正确方向的帮助!

    谢谢!

    编辑1: 样本数据:

    CREATE TABLE IF NOT EXISTS `customers` (
      `hash` varchar(32) NOT NULL,
      `date_joined` date NOT NULL,
      `agent_code` int(5) NOT NULL DEFAULT '0',
      PRIMARY KEY (`hash`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    INSERT INTO `customers` (`hash`, `date_joined`, `agent_code`) VALUES
    ('0323619e9dd37726ad9aede6b8941022', '2012-09-17', 20004),
    ('0a5a74acc39773c191b87b759799b0c0', '2012-08-02', 22109),
    ('1aa4d97ba79dce047d519efe3832b5e5', '2012-07-19', 22109),
    ('2605578b2e35f01f473591d8f3ed3c51', '2012-08-06', 20003),
    ('26ce0904a6ea30da9b181a301937664e', '2012-07-30', 20003);
    
    
    
    
     CREATE TABLE IF NOT EXISTS `persons` (
      `agent_code` int(11) NOT NULL DEFAULT '0',
      PRIMARY KEY (`agent_code`)
     ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    
    
      INSERT INTO `persons` (`agent_code`) VALUES
      (20003),(20004);
    

2 个答案:

答案 0 :(得分:1)

这是你在找什么?下面的查询显示agent_code 20003的结果。您可以根据需要添加基于日期的条件(例如日期范围或指定星期)。

您可以在行动here中看到它。

<强>查询

SELECT DATE_FORMAT(customers.date_joined, '%W %e') AS 'dt', persons.agent_code AS 'agent', COUNT(*) AS 'customers'
FROM customers 
INNER JOIN persons ON persons.agent_code = customers.agent_code
WHERE persons.agent_code = 20003
GROUP BY customers.date_joined, persons.agent_code

<强>结果

|        DT | AGENT | CUSTOMERS |
---------------------------------
| Monday 30 | 20003 |         1 |
|  Monday 6 | 20003 |         1 |

答案 1 :(得分:0)

本周:

select c.agent_code, c.date_joined, count(c.hash) 
from 
    customers c
    left join 
    persons p on p.agent_code = c.agent_code
where weekofyear(date_joined) = weekofyear(current_date) 
group by c.agent_code, c.date_joined
;
+------------+-------------+---------------+
| agent_code | date_joined | count(c.hash) |
+------------+-------------+---------------+
|      20004 | 2012-09-17  |             1 |
+------------+-------------+---------------+

如果您想再过一周,请将current_date替换为该周内的任何日期。