如何按不同年份分组统计各供应商年度总销售额?
按供应商分组统计各年份总销售额的SQL实现
需求说明
需要按年份分组,统计每个供应商在2019、2020、2021年的总销售额(总销售额=total - costo_envio),以每列对应一个年份的形式展示数据,但当前仅能获取2019年的结果。
当前SQL及结果
当前查询语句
query=''' SELECT ven.nombre_vendedor, SUM(total-costo_envio) AS año2019 FROM itens_pedidos ip INNER JOIN pedidos ped ON ped.pedido_id=ip.pedido_id INNER JOIN vendedores ven ON ven.vendedor_id=ped.vendedor_id WHERE fecha_compra BETWEEN \"2019-01-01\" AND \"2019-31-12\" GROUP BY ven.nombre_vendedor LIMIT 5 '''
当前输出结果
| nombre_vendedor | año_2019 |
|---|---|
| Ana Duarte | 2154261.6 |
| Daniel Siqueira | 2020503.2 |
| Millena Pereira | 2054682.4 |
| Nadia Oliveira | 2296986.4 |
修改后的SQL语句
要实现多年份列展示,可使用条件聚合的方式,同时修正日期格式错误(原2019-31-12应为2019-12-31):
query=''' SELECT ven.nombre_vendedor, SUM(CASE WHEN fecha_compra BETWEEN '2019-01-01' AND '2019-12-31' THEN (total - costo_envio) ELSE 0 END) AS año2019, SUM(CASE WHEN fecha_compra BETWEEN '2020-01-01' AND '2020-12-31' THEN (total - costo_envio) ELSE 0 END) AS año2020, SUM(CASE WHEN fecha_compra BETWEEN '2021-01-01' AND '2021-12-31' THEN (total - costo_envio) ELSE 0 END) AS año2021 FROM itens_pedidos ip INNER JOIN pedidos ped ON ped.pedido_id = ip.pedido_id INNER JOIN vendedores ven ON ven.vendedor_id = ped.vendedor_id WHERE fecha_compra BETWEEN '2019-01-01' AND '2021-12-31' -- 限定三年范围,避免无关数据 GROUP BY ven.nombre_vendedor LIMIT 5 '''
逻辑说明
- 使用
CASE WHEN语句筛选对应年份的订单记录,仅对该年份的total - costo_envio进行求和,非目标年份的记录按0处理; - 去掉原查询中单一年份的WHERE限制,改为限定2019-2021的范围,确保包含所有需要统计的年份数据;
- 保持
GROUP BY ven.nombre_vendedor,确保每个供应商对应一行数据,各年份销售额以列的形式呈现。
期望输出结果
| nombre_vendedor | año2019 | año2020 | año2021 |
|---|---|---|---|
| Ana Duarte | 2154261.6 | 5054009.6 | 7154261.6 |
| Daniel Siqueira | 2020503.2 | 5254009.6 | 9054261.6 |
| Millena Pereira | 2054682.4 | 3854261.6 | 1854261.6 |
| Nadia Oliveira | 2296986.4 | 2154261.6 | 4554261.6 |
内容的提问来源于stack exchange,提问作者Gabriel Chavez
相关产品推荐
相关产品推荐

