查询卸妆水库存入库领用数据核对.sql 4.06 KB
-- ============================================
-- 卸妆水库存、入库、领用数据核对
-- ============================================
-- 说明:检查卸妆水的当前库存、入库总量、领用总量,验证数据是否对齐
-- 平衡关系:入库总量 = 当前库存 + 已领取数量
-- ============================================

-- 一、查找卸妆水产品
SELECT 
    F_Id AS 产品ID,
    F_ProductName AS 产品名称,
    F_Price AS 价格,
    F_AveragePrice AS 平均单价
FROM lq_product
WHERE F_ProductName LIKE '%卸妆水%';

-- 二、卸妆水库存/入库/领用汇总(按产品)
-- 说明:领用数量只统计「已领取」(F_IsReceived=1) 的申请批次
SELECT 
    p.F_Id AS 产品ID,
    p.F_ProductName AS 产品名称,
    IFNULL(inv.入库总量, 0) AS 入库总量,
    IFNULL(recv.已领取数量, 0) AS 已领取数量,
    IFNULL(inv.入库总量, 0) - IFNULL(recv.已领取数量, 0) AS 当前可用库存,
    CASE 
        WHEN IFNULL(inv.入库总量, 0) = IFNULL(recv.已领取数量, 0) + (IFNULL(inv.入库总量, 0) - IFNULL(recv.已领取数量, 0))
        THEN '✅ 对齐'
        ELSE '❌ 异常'
    END AS 数据是否对齐
FROM lq_product p
LEFT JOIN (
    -- 入库总量(有效库存记录)
    SELECT 
        F_ProductId,
        SUM(F_Quantity) AS 入库总量
    FROM lq_inventory
    WHERE F_IsEffective = 1
    GROUP BY F_ProductId
) inv ON inv.F_ProductId = p.F_Id
LEFT JOIN (
    -- 已领取数量(仅统计 F_IsReceived=1 的申请批次下的使用记录)
    SELECT 
        u.F_ProductId,
        SUM(u.F_UsageQuantity) AS 已领取数量
    FROM lq_inventory_usage u
    INNER JOIN lq_inventory_usage_application a 
        ON a.F_UsageBatchId = u.F_UsageBatchId 
        AND a.F_IsEffective = 1 
        AND a.F_IsReceived = 1
    WHERE u.F_IsEffective = 1
    GROUP BY u.F_ProductId
) recv ON recv.F_ProductId = p.F_Id
WHERE p.F_ProductName LIKE '%卸妆水%';

-- 三、卸妆水入库明细(按批次)
SELECT 
    p.F_ProductName AS 产品名称,
    i.F_Id AS 库存记录ID,
    i.F_BatchNumber AS 批次号,
    i.F_Quantity AS 入库数量,
    i.F_StockInTime AS 入库时间,
    i.F_StockInType AS 入库类型,
    i.F_IsEffective AS 是否有效
FROM lq_inventory i
INNER JOIN lq_product p ON p.F_Id = i.F_ProductId
WHERE p.F_ProductName LIKE '%卸妆水%'
  AND i.F_IsEffective = 1
ORDER BY i.F_StockInTime DESC;

-- 四、卸妆水领用明细(仅已领取)
SELECT 
    p.F_ProductName AS 产品名称,
    u.F_UsageBatchId AS 批次ID,
    u.F_UsageQuantity AS 领用数量,
    u.F_UsageTime AS 使用时间,
    a.F_ReceiveTime AS 领取时间,
    a.F_ApprovalStatus AS 审批状态,
    a.F_IsReceived AS 是否已领取
FROM lq_inventory_usage u
INNER JOIN lq_product p ON p.F_Id = u.F_ProductId
INNER JOIN lq_inventory_usage_application a 
    ON a.F_UsageBatchId = u.F_UsageBatchId 
    AND a.F_IsEffective = 1 
    AND a.F_IsReceived = 1
WHERE p.F_ProductName LIKE '%卸妆水%'
  AND u.F_IsEffective = 1
ORDER BY u.F_UsageTime DESC;

-- 五、数据平衡校验(简化版)
-- 期望:入库总量 = 当前可用库存 + 已领取数量
SELECT 
    p.F_ProductName AS 产品名称,
    IFNULL(inv.入库总量, 0) AS 入库总量,
    IFNULL(recv.已领取数量, 0) AS 已领取数量,
    IFNULL(inv.入库总量, 0) - IFNULL(recv.已领取数量, 0) AS 当前可用库存_计算值,
    IFNULL(inv.入库总量, 0) - (IFNULL(inv.入库总量, 0) - IFNULL(recv.已领取数量, 0)) - IFNULL(recv.已领取数量, 0) AS 平衡差_应为0
FROM lq_product p
LEFT JOIN (
    SELECT F_ProductId, SUM(F_Quantity) AS 入库总量
    FROM lq_inventory WHERE F_IsEffective = 1 GROUP BY F_ProductId
) inv ON inv.F_ProductId = p.F_Id
LEFT JOIN (
    SELECT u.F_ProductId, SUM(u.F_UsageQuantity) AS 已领取数量
    FROM lq_inventory_usage u
    INNER JOIN lq_inventory_usage_application a 
        ON a.F_UsageBatchId = u.F_UsageBatchId AND a.F_IsEffective = 1 AND a.F_IsReceived = 1
    WHERE u.F_IsEffective = 1
    GROUP BY u.F_ProductId
) recv ON recv.F_ProductId = p.F_Id
WHERE p.F_ProductName LIKE '%卸妆水%';