【问题标题】:SQL to reconcile two tablesSQL 协调两个表
【发布时间】:2017-03-01 20:43:01
【问题描述】:

我有两个表 ItemSold 和 ItemInventory,我正在尝试创建一个查询来检查 ItemSold SUM(项目的数量)是否与 ItemInventory 保持平衡。

ItemSold
sale_id | item_id | quantity | conversion |
--------  -------   ---------  ----------  
  1099       1         1.00       1.00
  1099       1         1.00       0.50
  1099       2         1.00       1.00

我使用转换列来表示商品的零售/较小单位

ItemInventory
  id |   description | quantity
-----   ------------   --------
  1        Item1         100.00
  2        Item2         100.00

下面是我创建的一个查询,用于检查是否有物品的总和大于 ItemInventory 上的数量。

SELECT ItemSold.item_id, ItemSold.quantity, ItemSold.conversion
FROM ItemSold 
INNER JOIN ItemInventory 
ON ItemSold.item_id = ItemInventory.id
WHERE Itemsold.sale_id = @saleid
GROUP BY ItemSold.item_id, ItemSold.quantity, ItemSold.conversion 
HAVING SUM(ItemSold.quantity * ItemSold.conversion) > SUM(ItemInventory.quantity)

它有效,但它比较 ItemSold 上 EACH ROW 的数量,而不是 SUM(按 item_id 分组的数量)。

我的目标是不处理销售交易,除非有足够的库存,无论该商品的销售单位是什么。

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    此查询的策略是汇总ItemSold 表中每个项目的承诺销售总量,然后将该数字与可用的库存数量进行比较。结果集中显示数量不足的项目。

    SELECT t1.id,
           t1.description
    FROM ItemInventory t1
    LEFT JOIN
    (
        SELECT item_id, SUM(quantity*conversion) AS quantity_sold
        FROM ItemSold
        GROUP BY item_id
    ) t2
        ON t1.id = t2.item_id
    WHERE t1.quantity < COALESCE(t2.quantity_sold, 0)
    

    【讨论】:

    • 您在 t2 子句中使用了三列,但仅按 item_id 分组。我认为这行不通。是不是忘记了金额?
    • @Ming 我忘了接SUM(),抱歉。
    【解决方案2】:

    这将检查所有物品是否在 1099 的 sale_id 的库存中:

    SELECT sale_id,
           MIN( CASE WHEN s.total_quantity <= i.quantity THEN 1 ELSE 0 END )
             AS can_process_order
    FROM   ( SELECT sale_id,
                    item_id,
                    SUM( quantity ) AS total_quantity
             FROM   itemsold
             WHERE  sale_id = 1099
             GROUP BY sale_id, item_id
           ) s
           LEFT OUTER JOIN
           iteminventory i
           ON ( s.item_id = i.id )
    GROUP BY sale_id;
    

    如果有足够的商品,它将输出1,如果任何一件商品的库存不足,它将输出0

    要执行更新,您可以:

    MERGE INTO iteminventory dst
    USING (
      SELECT i.ROWID AS rid,
             total_sale,
             MIN( CASE WHEN total_sale <= quantity THEN 1 ELSE 0 END )
               OVER ( PARTITION BY sale_id ) AS can_process_sale
      FROM   (
        SELECT sale_id,
               item_id,
               SUM( quantity ) AS total_sale
        FROM   itemsold
        WHERE  sale_id = 1099
        GROUP BY sale_id, item_id
      ) s
      LEFT OUTER JOIN iteminventory i
      ON ( i.id = s.item_id )
    ) src
    ON ( src.rid = dst.ROWID AND src.can_process_sale = 1 )
    WHEN MATCHED THEN
      UPDATE SET quantity = quantity - total_sale;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-27
      相关资源
      最近更新 更多