MySql SUM和JOIN

时间:2011-04-18 11:58:36

标签: mysql jsp

我正在尝试计算销售代理商列表所做的销售额,每隔几分钟计算一次,并更新一个显示“销售排行榜”的屏幕,这是在后台使用Ajax调用进行的更新。

我有一个表,每晚创建并填充包含agent_id和周和月的总销售额。我在飞行中创建了第二个临时表,计算当天的销售额。

我需要合并这两个表来为agent_count中的所有代理创建当前的销售列表。

表agent_count;

agent_id (varchar),
team_id (varchar),
name (varchar),
day(int),
week(int), 
month(int)

表销售;

agent_id (varchar),
day(int)

我无法弄清楚如何组合这些表格。我想我需要使用连接,因为必须返回所有代理 - 即使它们没有出现在agent_count表中。

首先,我打一个简单的电话来获取所有座席的周和月总数

SELECT agent_id, team_id, name, week, month FROM agent_count;

我创建了今天销售的临时表,然后计算当天每个代理商的销售额

CREATE TEMPORARY TABLE temp_todays_sales
SELECT s.id, s.agent_id
FROM sales s 
WHERE DATEDIFF(s.uploaded, NOW()) = 0 
AND s.valid = 1;

SELECT tts.agent_id, COUNT(tts.id) as today 
FROM temp_todays_sales tts
GROUP BY tts.agent_id;

将这些结合起来以最终得到结果集(如

)的最佳/最简单方法是什么?
agent_id, team_id, name, day, week, month

其中周和月也包括每日总计

感谢您的帮助!

克里斯蒂

1 个答案:

答案 0 :(得分:1)

SELECT  s.agent_id, ac.team_id, ac.name,
        s.`day` + COALESCE(ac.`day`, 0) AS `day`,
        s.`day` + COALESCE(ac.`week`, 0) AS `week`,
        s.`day` + COALESCE(ac.`month`, 0) AS `month`
FROM    sales s
LEFT JOIN
        agent_count ac
ON      ac.agent_id = s.agent_id
如果代理商team_id中没有记录,则

nameNULL将为agent_count

如果两个表中的代理都丢失了,你通常需要制作一个FULL JOIN,但由于MySQL不支持后者,你可以使用它的穷人代替:

SELECT  agent_id, MAX(team_id), MAX(name),
        SUM(day), SUM(week), SUM(month)
FROM    (
        SELECT  agent_id, NULL AS team_id, NULL AS name, day, day AS week, day AS month
        FROM    sales
        UNION ALL
        SELECT  *
        FROM    agent_count
        ) q
GROUP BY
        agent_id