SQL查询需求:获取所有门店记录(含无销售数据的门店)
问题与解决方案
现有表结构
T1(门店销售表)
Store Sales DateT A01 100 01-01-22 B01 200 01-01-22 C01 300 01-01-22
T2(门店表)
CodeStore Name A01 Name1 B01 Name2 C01 Name3 D01 Name4
需求
查询所有门店的销售数据,即使门店在指定日期(01-01-22)没有销售记录,也要在结果中显示该门店,预期结果如下:
Store Sales A01 100 B01 200 C01 300 D01
原SQL问题分析
你之前的SQL存在两个核心问题:
- 主表选择错误:使用
T1 LEFT OUTER JOIN T2是以销售表T1为基础,只会返回有销售记录的门店,无法覆盖T2中所有门店。 - 过滤条件位置错误:
WHERE DateT = '01-01-22'会直接过滤掉T2中无匹配销售记录的行(这类行的DateT为NULL,不满足等于条件),导致无销售的门店被排除。
正确SQL方案
SELECT t2.CodeStore AS Store, COALESCE(SUM(t1.Sales), '') AS Sales FROM T2 LEFT OUTER JOIN T1 ON t2.CodeStore = t1.Store AND t1.DateT = '01-01-22' GROUP BY t2.CodeStore
说明
- 以T2作为主表做左连接,确保所有门店都能被查询到。
- 将日期条件放到
ON子句中,仅过滤T1中对应日期的销售数据,不会影响T2的完整门店列表。 - 用
COALESCE(SUM(t1.Sales), '')处理无销售记录的场景:当SUM结果为NULL时,返回空字符串,与预期结果格式一致。
内容的提问来源于stack exchange,提问作者HAMZA.SOUFIANE
相关产品推荐
相关产品推荐

