Left Join按右表字段Group By报错,需显示餐厅名称的SQL求助
问题解决方案
报错原因
这个报错源于SQL的分组规则:非聚合函数的列必须出现在GROUP BY子句中。你的语句里引用了A.restaurant_id,但既没将其加入GROUP BY,也没放在SUM/COUNT这类聚合函数里,因此数据库抛出了该错误。
解决思路
- 先通过
restaurant_id关联表A(订单明细)和表B(餐厅基础信息),获取餐厅名称 - 以餐厅名称作为分组依据(替代餐厅ID,满足显示需求)
- 利用条件聚合实现"行展示餐厅、列展示各月营收"的交叉表效果
示例SQL
SELECT B.restaurants_name AS 餐厅名称, SUM(CASE WHEN EXTRACT(MONTH FROM A.date) = 1 THEN A."order value (usd)" ELSE 0 END) AS 1月营收, SUM(CASE WHEN EXTRACT(MONTH FROM A.date) = 2 THEN A."order value (usd)" ELSE 0 END) AS 2月营收, SUM(CASE WHEN EXTRACT(MONTH FROM A.date) = 3 THEN A."order value (usd)" ELSE 0 END) AS 3月营收, -- 可根据需求继续添加其他月份的CASE语句 SUM(A."order value (usd)") AS 总营收 FROM "Table A" A JOIN "Table B" B ON A."Restaurants id" = B."Restaurants id" GROUP BY B.restaurants_name -- 按餐厅名称分组,符合SQL分组规则 ORDER BY B.restaurants_name;
补充说明
- 若需统计无订单记录的餐厅,可将
JOIN替换为LEFT JOIN - 提取月份的语法因数据库而异:MySQL用
MONTH(A.date),SQL Server用DATEPART(MONTH, A.date),可根据实际使用的数据库调整 - 若存在重名餐厅,需同时将
B."Restaurants id"加入GROUP BY子句,避免数据聚合错误
内容的提问来源于stack exchange,提问作者Bahadır Ayan
相关产品推荐
相关产品推荐

