繁体   English   中英

跨多个表聚合的查询

[英]Query to aggregate across multiple tables

我是 SQL 的新手,我正在尝试创建一个数据库来管理少量库存。 这是数据库的结构:

数据库结构

我需要创建一个查询来返回每种材料的总库存。 因此,第一步是查找与物料关联的所有批次。 其次,查找与每个批次相关的所有动作。 然后,对与每个移动相关的数量求和,但取决于移动类型(如果是良好收货则加 (+),但如果是库存提取则减 (-))。

以下是包含示例数据和所需结果的表格示例。

台面材质

材质ID 材质说明
1个 瓶子
2个 盒子

表格批次

批号 材质ID 供应商材料 供应商批次 截止日期
1000 1个 2096027 00123456 12/12/2025
1001 1个 2096027 00987654 11/11/2026
1002 2个 102400 202400E 2023 年 10 月 10 日

运动

运动ID 批号 运动类型 数量 由...制作 创建日期
1个 1000 好收据 100 user1@email.com 2022 年 4 月 10 日
2个 1000 库存提取 20 user2@email.com 2022 年 4 月 15 日
3个 1000 库存提取 25 user3@email.com 2022 年 4 月 17 日
4个 1001 好收据 100 user1@email.com 2022 年 4 月 20 日
5个 1001 库存提取 10 user4@email.com 2022 年 4 月 26 日
6个 1002 好收据 50 user1@email.com 2/26/2022

预期查询结果 - 每种材料的总库存:

材质说明 总库存
瓶子 145
盒子 50

TotalInventory计算:对于Bottle ,有两个 100 的收货移动和三个 20、25 和 10 的提货。因此,总库存将为 (100+100)-(20+25+10)=145。

谢谢你的帮助!

select
    mat.MaterialDescription,
    sum(
        case mov.MovementType
            when 'Good receipt' then 1
            when 'Inventory withdrawal' then -1
            else 0 /* don't know what to do for other MovementTypes */
        end * mov.Quantity
    ) as TotalInventory
from
    Material as mat
    left join Batch as bat on bat.MaterialID = mat.MaterialID
    left join Movement as mov on mov.BatchID = bat.BatchID
group by
    mat.MaterialDescription
;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM