我正在尝试计算销售代理列表的销售额,此计数每隔几分钟进行一次,并更新显示“销售排行榜”的屏幕,该屏幕是在后台使用 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
其中周和月还包括每日总计
感谢您的帮助!
克里斯蒂
最佳答案
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
和 name
将是 NULL
如果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
关于MySql SUM 和 JOIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5702501/