按组汇总的SQL查询SUM

24

我无法使我的查询按我需要的方式工作。 我有一个简单的查询,输出以下数据:

输入图像描述

我需要对每个月的total_reseller_sales进行求和,并且不显示相同的月份。 我尝试了以下方法,但出现错误:

SELECT rs.resellerid, rs.sid, SUM(rs.total_reseller_sales), s.month, s.sid 
FROM sales_report_resellers rs 
INNER JOIN resellers r ON rs.resellerid = r.resellerid 
INNER JOIN sales_report s ON rs.sid = s.sid 
WHERE (rs.sid > '294' AND rs.sid < '306') AND r.insidesales = 0 
  AND r.resellerid IN (7, 18, 22) 
GROUP BY month

我遇到的错误是每个SELECT中的元素无效,因为它们没有包含在聚合函数或GROUP BY子句中。

如果我将它们包含在GROUP BY中,那么我会得到相同的结果。

任何帮助都将不胜感激。


2
如果您不想重复显示同一个月份,那么当一个月份中存在两个经销商ID时,您应该显示什么? - ZLK
我认为在使用SUM、COUNT、MIN等函数时,需要使用Having而不是Where。 - user6646201
你不能在总和中同时显示经销商ID,因为你没有将它放入group by子句中。rs.sid和s.sid也是如此。你必须改变查询和字段列表的方法。 - Joe Taras
我能想象一个查询返回这些字段:SUM(rs.total_reseller_sales), s.month, rs.sid (带有分组方式如下s、month、rs.sid)。 - Joe Taras
如果您想总结销售额,那么您必须从SELECT语句中删除经销商ID(因为多个销售商在任何给定月份都会有销售)。如果您只想获得特定月份的销售总额,则停止尝试按经销商拆分。只需选择月份和SUM(total_reseller_sales)。 - pmbAustin
1个回答

27

GROUP BY 子句按照你在该子句中指定的每个唯一组合的列形成行。

如果您想显示每个月份的总和,则仅在group by子句中包含s.month:例如

SELECT s.month, SUM(rs.total_reseller_sales)
FROM sales_report_resellers rs 
INNER JOIN resellers r ON rs.resellerid = r.resellerid 
INNER JOIN sales_report s ON rs.sid = s.sid 
WHERE (rs.sid > '294' AND rs.sid < '306') AND r.insidesales = 0 
  AND r.resellerid IN (7, 18, 22) 
GROUP BY s.month
如果您在SELECT子句中包括经销商详细信息,并在GROUP BY子句中也包括它们,则每个经销商和月份将会有一行。

工作得非常完美。我猜你不需要在子句中添加rs.total_reseller_sales,因为有SUM函数? - Brasciole
非常感谢!我的问题是我在 INNER JOIN 之前有 GROUP BY ... - stevestar888

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接