You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用SQL多表左连接统计特定品牌每月已完成销售总额?

问题

需要生成月度报告,仅统计特定品牌(如品牌'X')已完成销售的总金额,数据分布在三个表中,其中一个表位于同一服务器的其他数据库:

  • payment表:存储客户信息、支付方式及订单总金额,id为订单ID,date为订单日期,total为订单总金额,orderstatus标记订单状态,payment_method为支付方式。
  • sales表:存储已售商品信息,通过order字段关联payment.idproduct_code为商品编码。
  • product表:位于同一服务器的database1数据库下(路径为database1.product),通过product_code关联sales表,make字段存储品牌名称。

现有一段统计各月销售总额(未按品牌筛选)的SQL:

select year(date) as year, month(date) as month, sum(total) as total_amount, payment_method AS type 
from payments 
WHERE orderstatus = 'complete' AND year(date) > '2016' 
group by year(date), month(date)

需要修改该查询,仅统计品牌'X'的已完成销售总金额,排除未完成交易及退款。

解决方案

通过表关联将三个表连接,筛选出品牌为'X'的订单后按年月聚合统计总额,修改后的SQL如下:

SELECT 
    YEAR(p.date) AS year,
    MONTH(p.date) AS month,
    SUM(p.total) AS total_amount,
    p.payment_method AS type
FROM 
    payments p
JOIN 
    sales s ON p.id = s.order
JOIN 
    database1.product pr ON s.product_code = pr.product_code
WHERE 
    p.orderstatus = 'complete' 
    AND YEAR(p.date) > '2016'
    AND pr.make = 'X' -- 筛选目标品牌
GROUP BY 
    YEAR(p.date), MONTH(p.date), p.payment_method

关键说明:

  1. 表关联逻辑
    • JOIN关联payments(别名p)和sales(别名s),确保只统计有对应商品记录的已完成订单。
    • 跨数据库关联database1.product(别名pr),通过商品编码获取品牌信息。
  2. 品牌筛选:在WHERE子句中添加pr.make = 'X',精准过滤目标品牌的订单数据。
  3. 分组修正:原查询的GROUP BY缺少payment_method,按照SQL标准(如MySQL的ONLY_FULL_GROUP_BY模式),需将SELECT中所有非聚合字段加入分组,避免语法错误。
  4. 无效订单排除:原条件p.orderstatus = 'complete'已排除未完成交易和退款订单,无需额外调整。

若存在单订单包含多商品(仅部分为品牌X)的场景:

  • 若需统计该订单全额,上述查询适用;
  • 若仅统计订单中品牌X商品对应的金额,需结合sales表的商品单价/金额字段重新计算(需补充sales表的金额类字段信息)。

内容的提问来源于stack exchange,提问作者user30379416

火山引擎 最新活动