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

如何按SalesOrderID汇总重复行的Weight值?

问题:按订单汇总总重量的SQL查询方法

我需要获取每个订单的总重量,对查询结果中的Weight字段按订单求和。当前查询返回的明细数据如下:

SalesOrderID SalesOrderDetailID SubTotal              CompanyName                                                                                                                      Weight
------------ ------------------ --------------------- -------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------
71774        110562             880,3484              Good Toys                                                                                                                        1061.40
71774        110563             880,3484              Good Toys                                                                                                                        988.83
71776        110617             78,81                 West Side Mart                                                                                                                   317.00
71780        110616             38418,6895            Nearby Cycle Shop                                                                                                                5098.36
71780        110617             38418,6895            Nearby Cycle Shop                                                                                                                24874.88
71780        110618             38418,6895            Nearby Cycle Shop                                                                                                                78053.76
71780        110619             38418,6895            Nearby Cycle Shop                                                                                                                2431.24
71780        110620             38418,6895            Nearby Cycle Shop                                                                                                                12596.19

当前使用的查询语句:

SELECT a.SalesOrderID, c.SalesOrderDetailID, a.SubTotal,b.CompanyName,
(SELECT c.OrderQty*d.Weight WHERE c.SalesOrderID=c.SalesOrderID) AS Weight
FROM SalesLT.SalesOrderHeader as a
INNER JOIN SalesLT.Customer AS b
ON a.CustomerID=b.CustomerID
INNER JOIN SalesLT.SalesOrderDetail AS c
ON c.SalesOrderID=a.SalesOrderID
INNER JOIN SalesLT.Product as d
ON d.ProductID=c.ProductID

我尝试用SUM(CASE WHEN)求和时报错,想知道其他可行方法。期望输出示例:71774 | 880,3484 | Good Toys | 2050,23(2050,23为该订单两条Weight记录的总和)。


解决方案

方法1:使用GROUP BY分组求和

这是最直接的方式,先修正单条明细的重量计算(原查询的子查询写法冗余且有误),再按订单维度分组汇总:

SELECT 
    a.SalesOrderID, 
    a.SubTotal, 
    b.CompanyName, 
    -- 按订单汇总所有明细的重量(订单数量×产品重量)
    SUM(c.OrderQty * d.Weight) AS TotalWeight
FROM SalesLT.SalesOrderHeader as a
INNER JOIN SalesLT.Customer AS b
    ON a.CustomerID = b.CustomerID
INNER JOIN SalesLT.SalesOrderDetail AS c
    ON c.SalesOrderID = a.SalesOrderID
INNER JOIN SalesLT.Product as d
    ON d.ProductID = c.ProductID
-- 按订单唯一标识分组,确保同一订单的所有明细被汇总
GROUP BY a.SalesOrderID, a.SubTotal, b.CompanyName
-- 可选:按订单ID排序,方便查看
ORDER BY a.SalesOrderID;

方法2:使用窗口函数(如需同时保留明细和汇总)

如果需要在保留明细行的同时显示对应订单的总重量,可以用窗口函数SUM() OVER (PARTITION BY ...):

SELECT 
    a.SalesOrderID, 
    c.SalesOrderDetailID,
    a.SubTotal, 
    b.CompanyName, 
    c.OrderQty * d.Weight AS DetailWeight,
    -- 计算当前订单的总重量
    SUM(c.OrderQty * d.Weight) OVER (PARTITION BY a.SalesOrderID) AS TotalWeight
FROM SalesLT.SalesOrderHeader as a
INNER JOIN SalesLT.Customer AS b
    ON a.CustomerID = b.CustomerID
INNER JOIN SalesLT.SalesOrderDetail AS c
    ON c.SalesOrderID = a.SalesOrderID
INNER JOIN SalesLT.Product as d
    ON d.ProductID = c.ProductID;

关于SUM(CASE WHEN)报错的说明

你之前用SUM(CASE WHEN)报错,大概率是因为没有配合GROUP BY分组,或者CASE WHEN的逻辑不符合分组需求。比如如果没有分组,SUM()会计算全局总和,而不是按订单分组;如果CASE WHEN的条件没有正确关联订单ID,也会导致结果错误或语法报错。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 04:40:27