我有两个表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的数量组)。
我的目标是不处理销售交易,除非有足够的库存,无论该商品的销售单位是什么。
答案 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;