用于协调两个表

时间:2017-03-01 08:38:51

标签: sql oracle

我有两个表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

下面是我创建的一个查询,用于检查是否存在如果SUM up大于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上的每个行的数量而不是SUM(按item_id的数量组)。

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

2 个答案:

答案 0 :(得分:0)

此查询的策略是为每个项目汇总承诺在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)

答案 1 :(得分:0)

这将检查所有项目是否在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;