You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle SQL需求:按月展示月份名称、订单数量及订单总额

解决Oracle SQL查询月份订单统计问题

没问题,我来帮你实现这个查询需求——展示月份名称、每月订单数量以及订单总金额。你的推测完全正确,确实需要用GROUP BY按月份分组,另外我们需要调整表关联逻辑并借助Oracle的日期函数来提取规范的月份名称。

需求分析与表关联逻辑梳理

我们需要的核心数据来源和计算逻辑:

  • 月份名称:从Pedido(订单表)的dt_venda(销售日期)字段提取
  • 每月订单数量:统计每个月的唯一订单数(注意一个订单可能对应多个订单项,不能直接统计行数,否则会重复计数)
  • 订单总金额:每个订单项的金额为Item_Pedido.nr_quantidade(购买数量) × Produto.vl_preco(产品单价),再按月求和

不需要关联Cliente(客户表),因为需求里没有涉及客户相关字段,去掉它能简化查询逻辑。

最终查询语句

SELECT
    -- 提取无尾部空格的英文月份名称,若需葡萄牙语可替换NLS参数
    TO_CHAR(p.dt_venda, 'fmMonth', 'NLS_DATE_LANGUAGE = ENGLISH') AS month_name,
    -- 统计每月的唯一订单数量
    COUNT(DISTINCT p.id_pedido) AS total_orders,
    -- 计算每月所有订单的总金额
    SUM(ip.nr_quantidade * pr.vl_preco) AS total_amount
FROM
    Pedido p
INNER JOIN
    Item_Pedido ip ON p.id_pedido = ip.id_pedido
INNER JOIN
    Produto pr ON ip.id_produto = pr.id_produto
-- 可选:如果需要筛选特定年份,添加如下WHERE条件
-- WHERE EXTRACT(YEAR FROM p.dt_venda) = 2024
GROUP BY
    -- 同时按月份名称和月份数字分组,避免不同年份的同月被合并
    TO_CHAR(p.dt_venda, 'fmMonth', 'NLS_DATE_LANGUAGE = ENGLISH'),
    EXTRACT(MONTH FROM p.dt_venda)
ORDER BY
    -- 按月份数字排序,确保结果按1-12月顺序展示
    EXTRACT(MONTH FROM p.dt_venda);

关键细节说明

  1. 月份名称格式化:

    • 'fmMonth'中的fm是"填充模式",用来去掉Oracle默认返回的月份名称尾部空格(比如默认会返回'January ',用fm后返回干净的'January')
    • 如果需要葡萄牙语月份名称,只需将NLS_DATE_LANGUAGE = ENGLISH替换为NLS_DATE_LANGUAGE = PORTUGUESE
  2. 订单数量统计:

    • 使用COUNT(DISTINCT p.id_pedido)而非COUNT(*),因为一个订单会对应多个订单项,直接统计行数会重复计算订单数
  3. 分组与排序:

    • 分组时同时包含月份名称和月份数字,方便后续按自然月份顺序排序;如果需要按「年+月」维度统计,只需在SELECT和GROUP BY中加入EXTRACT(YEAR FROM p.dt_venda)即可

对你之前查询的调整说明

你之前的查询关联了客户表但需求并不需要,且没有做分组和聚合计算,这就是为什么没得到预期的每月统计结果。调整后去掉了无关表关联,加入了分组和聚合函数,就能得到你想要的统计数据了。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:56:04