2017-03-01 11 views
2

2つのテーブルItemSoldとItemInventoryがあり、ItemSold SUM(アイテムの数量)がItemInventoryと釣り合っているかどうかを確認するクエリを作成しようとしています。2つのテーブルを照合するSQL

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) 

これは機能しますが、SUM(item_idによるquantityグループ)ではなく、ItemSoldのEACH ROWの量を比較します。

私の目標は、商品の販売単位に関係なく在庫が十分でない限り、販売取引を処理しないことです。

答えて

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) 
+0

あなたのitem_idだけでt2の句が、グループ内の3列を使用していました。私はこれがうまくいかないと思う。あなたは合計を忘れていますか? – Ming

+1

@Ming私は 'SUM()'を忘れてしまいました。 –

+0

私が必要としていたことをありがとう。 – jntbox

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; 
関連する問題