Skip to content
Advertisement

Slow Moving Stock Items Query

I am trying to return a list of slow-moving stock items. Whenever there is a sale, the items are written to the saleItems table. I want to get those items from inventoryMaster table that are not appearing in the saleItems table within the past N days. Here is my structure.

db_inventory - all inventory items are stored here in stockmain table
db_main - all sale transactions recorded here in saleitems table

below is the query which gives me an error

SELECT db_inventory.StockMain.ItemCode 
FROM 
db_inventory.StockMain
JOIN 
db_main.SaleItems 
ON 
db_main.SaleItems.ItemID=db_inventory.StockMain.ItemCode
WHERE NOT IN(
   SELECT db_main.SaleItems.ItemID FROM db_main.SaleItems 
   WHERE db_main.SaleItems.saledate BETWEEN 
   DATE_SUB(CURDATE(),INTERVAL 90 DAY) AND NOW()
)

Advertisement

Answer

Use NOT EXISTS with a correlated subquery.

SELECT ItemCode 
FROM db_inventory.StockMain i
WHERE NOT EXISTS (
    SELECT 1
    FROM db_main.SaleItems m
    WHERE m.ItemID = i.ItemID AND m.saledate > NOW() - INTERVAL 90 DAY
)

The subquery ensures that, for the given item in the inventory, no record exists in the sales table over the last 90 days.

User contributions licensed under: CC BY-SA
2 People found this is helpful
Advertisement