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

按物料汇总唯一总量的SQL查询优化需求

按物料汇总唯一总量的SQL优化方案

需求说明

需要实现按物料维度汇总唯一总量:

  • 同一物料的重复总量值仅保留一次
  • 同一物料的不同总量值需求和合并

原SQL查询

WITH MaterialVolume
AS
(
SELECT          m.LookupCode as materials,
                sum( distinct lpc.PackagedAmount) as totalQty,
                (mpl.Length * mpl.Width * mpl.Height * sum(distinct lpc.PackagedAmount)) / 1728  as volumeQty,
                lpc.captureDate

FROM            dbo.Materials m 
JOIN            dbo.MaterialsPackagingsLookup mpl on m.id = mpl.MaterialId
JOIN            dbo.Lots l on m.id = l.MaterialId
JOIN            dbo.LicensePlateContentsSnapshot lpc on lpc.LotId = l.id
JOIN            dbo.Projects p on m.ProjectId = p.id

WHERE         p.LookupCode = 'Neighbor'
  AND m.LookupCode in('45934MR-F01600','45934HR-F01461','45935HR-F01461')


GROUP BY        m.LookupCode,
                mpl.Length,
                mpl.Width,
                mpl.Height,
                lpc.captureDate

)

SELECT          materials,
                totalQty,
                round(volumeQty,0) as roundTotalVolume,
                captureDate

FROM            MaterialVolume

ORDER BY        materials,captureDate

当前查询结果问题

原查询按物料、包装尺寸和日期分组,导致同一物料因日期不同重复出现,部分物料存在多组不同总量值:

materialstotalQtyroundTotalVolumecaptureDate
45934HR-F0146113.00126.0000002025-03-11 00:00:00.000
45934HR-F0146113.00126.0000002025-03-12 00:00:00.000
45934HR-F0146113.00126.0000002025-03-13 00:00:00.000
45934HR-F0146113.00126.0000002025-03-14 00:00:00.000
45934MR-F016007.0068.0000002025-03-11 00:00:00.000
45934MR-F016007.0068.0000002025-03-12 00:00:00.000
45934MR-F016007.0068.0000002025-03-13 00:00:00.000
45934MR-F0160014.00136.0000002025-03-26 00:00:00.000
45934MR-F0160014.00136.0000002025-03-27 00:00:00.000
45935HR-F0146113.00126.0000002025-03-11 00:00:00.000
45935HR-F0146113.00126.0000002025-03-12 00:00:00.000
45935HR-F0146113.00126.0000002025-03-13 00:00:00.000
45935HR-F0146113.00126.0000002025-03-20 00:00:00.000
45935HR-F0146113.00126.0000002025-03-21 00:00:00.000
45935HR-F0146113.00126.0000002025-03-25 00:00:00.000
45935HR-F0146154.00525.0000002025-03-26 00:00:00.000
45935HR-F0146154.00525.0000002025-03-27 00:00:00.000
45935HR-F0146154.00525.0000002025-03-28 00:00:00.000

需要实现的逻辑:

  • 物料45934HR-F01461的roundTotalVolume为126,重复多次,仅保留该值
  • 物料45934MR-F01600有68和136两种值,汇总为68+136=204
  • 物料45935HR-F01461有126和525两种值,汇总为126+525=651

优化后的SQL查询

WITH MaterialVolume AS (
    SELECT 
        m.LookupCode AS materials,
        SUM(DISTINCT lpc.PackagedAmount) AS totalQty,
        (mpl.Length * mpl.Width * mpl.Height * SUM(DISTINCT lpc.PackagedAmount)) / 1728 AS volumeQty,
        lpc.captureDate
    FROM dbo.Materials m 
    JOIN dbo.MaterialsPackagingsLookup mpl ON m.id = mpl.MaterialId
    JOIN dbo.Lots l ON m.id = l.MaterialId
    JOIN dbo.LicensePlateContentsSnapshot lpc ON lpc.LotId = l.id
    JOIN dbo.Projects p ON m.ProjectId = p.id
    WHERE 
        p.LookupCode = 'Neighbor'
        AND m.LookupCode IN('45934MR-F01600','45934HR-F01461','45935HR-F01461')
    GROUP BY 
        m.LookupCode,
        mpl.Length,
        mpl.Width,
        mpl.Height,
        lpc.captureDate
),
UniqueMaterialValues AS (
    -- 先按物料和去重后的roundTotalVolume分组,确保同一物料的相同值只保留一次
    SELECT 
        materials,
        MAX(totalQty) AS totalQty, -- 同一值对应的totalQty一致,取MAX/MIN均可
        ROUND(volumeQty, 0) AS roundTotalVolume
    FROM MaterialVolume
    GROUP BY materials, ROUND(volumeQty, 0)
)
-- 最终按物料汇总求和
SELECT 
    materials,
    SUM(totalQty) AS totalQty,
    SUM(roundTotalVolume) AS roundTotalVolume
FROM UniqueMaterialValues
GROUP BY materials
ORDER BY materials;

优化后查询结果

materialstotalQtyroundTotalVolume
45934HR-F0146113.00126
45934MR-F0160021.00204
45935HR-F0146167.00651

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 04:53:10