我正在尝试计算销售代理商列表所做的销售额,每隔几分钟计算一次,并更新一个显示“销售排行榜”的屏幕,这是在后台使用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
其中周和月也包括每日总计
感谢您的帮助!
克里斯蒂
答案 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
中没有记录,则 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