我很难在脑子里工作,需要一些帮助来确定是否有更好的方法来产生相同的结果。
我们有3个表:商店,部门,销售。 每个商店都可以有很多部门。 每个部门都可以有很多销售。
我有一个查询列出每个商店和计数&总结销售相关性。但是当我觉得它应该可以在1中完成时,操作是用2个子查询进行的。
这只是一个运行得很快的样本。在我正在建立的现实世界报告中,我发现我添加的每个后续子查询都会显着降低报告的整体性能。
SELECT `name`,
@totalvalue := ( SELECT SUM(`price`) FROM `sales` WHERE `sales`.`department` IN (
SELECT `id` FROM `departments` WHERE `departments`.`store`=`stores`.`id`
) ) AS `totalvalue`,
@totalsales := ( SELECT COUNT(*) FROM `sales` WHERE `sales`.`department` IN (
SELECT `id` FROM `departments` WHERE `departments`.`store`=`stores`.`id`
) ) AS `totalsales`,
ROUND(@totalvalue / @totalsales,2) AS `averagesale`
FROM `stores`;
如何在1子查询中或通过连接生成totalsales
和totalvalue
?
非常感谢您提供的任何帮助。
答案 0 :(得分:3)
您必须一起使用GROUP BY聚合函数和JOIN表:
SELECT st.name, SUM(s.price) totalvalue, COUNT(s.id) totalsales, ROUND(AVG(s.price),2) averagesale
FROM stores st
LEFT JOIN departments d ON d.store=st.id
LEFT JOIN sales s ON s.department=d.id
GROUP BY st.name
LEFT JOIN,因为你想要显示所有商店,无论是否有任何数据,否则你会使用INNER JOIN。
此外,您不必自己计算平均值 - 内置函数。只要您不需要加权平均值就足够了。