BigQuery技术需求:按月统计各国/地区销售、订单等核心数据
BigQuery月度销售统计实现方案
原SQL存在的问题
- 子查询全局统计所有订单数,未按地区和月份分组,导致每个分组返回相同的总订单数
- 字段别名错误:
COUNT(DISTINCT CustomerID)被命名为SalesPersonID,混淆了客户数与销售人员数 - GROUP BY包含
OrderDate(日度)和TotalDue,导致无法按月份聚合,反而会拆分同一地区同一月份内不同日期、不同金额的记录
正确实现SQL
SELECT -- 将日度日期转换为月度,返回当月第一天;也可使用FORMAT_DATE("%Y-%m", OrderDate)得到"YYYY-MM"格式的年月字符串 DATE_TRUNC(OrderDate, MONTH) AS order_month, TerritoryID, COUNT(SalesOrderID) AS order_count, -- 统计订单数量 COUNT(DISTINCT CustomerID) AS customer_count, -- 统计客户数量 COUNT(DISTINCT SalesPersonID) AS salesperson_count, -- 统计销售人员数量 SUM(TotalDue) AS total_sales_amount -- 统计销售总金额 FROM adwentureworks_db.salesorderheader -- 可选:根据业务需求过滤无效数据,比如取消的订单 -- WHERE Status = 5 -- 请根据实际业务状态值调整 GROUP BY order_month, TerritoryID ORDER BY order_month DESC, TerritoryID;
关键说明
- 日期聚合:用
DATE_TRUNC(OrderDate, MONTH)把日度数据收拢到月度维度,确保同月份的所有记录归为一组 - 聚合函数逻辑:
COUNT(SalesOrderID):直接统计独立订单数(每个SalesOrderID对应一个订单)COUNT(DISTINCT CustomerID):去重统计当月该地区的唯一客户数量COUNT(DISTINCT SalesPersonID):去重统计当月该地区的唯一销售人员数量(需确保表中存在SalesPersonID字段,字段名不符请自行调整)SUM(TotalDue):累加当月该地区的销售总金额
- 分组规则:仅按
order_month(月度)和TerritoryID(地区)分组,避免无关字段导致的分组拆分
内容的提问来源于stack exchange,提问作者Sandra
相关产品推荐
相关产品推荐

