How do i optimize following sql query, it has 4 times same 'select' statement, and then perform 4 different where function. can i just have one 'select statement'. this runs slow.
SELECT I.ItemID,
I.ItemCode,
I.ItemName,
B.Brandname AS 'Brand',
PM.Productname AS 'Product',
CASE
WHEN I.ItemName LIKE '%LED%' THEN 'LED'
ELSE TM.TypeName
END AS 'Type',
( V.OpeningStock + PurchaseVirtual + SalesReturnVirtual + VirChangeReplaceIn + VirBranchTransIn ) - ( SalesVirtual + PurchaseReturnVirtual + VirZeroReplaceOut + VirChangeReplaceOut + VirCNOut + PVCNOut + VirBranchTransOut ) AS 'VirtualStock',
( V.OpeningStock + PurchasePhysical + TransferIn + TransferOutReturn + SalesReturnPhysical + PhyReplaceCompanyIn + FromSSIRepairIn + PhyChangeReplaceIn + PhyReapirCompanyInAPhyBranchTransIn ) - ( SalesPhysical + TransferOut + PurchaseReturnPhysical + ToSSIRepairOut + PhyZeroReplaceOut + PhyChangeReplaceOut + PhyReplaceCompanyOut + PhyCNOut + PhyRepairCompanyOut + PhyReplaceCustOut + PhyBranchTransOut ) AS 'PhysicalStock',
( ( TransferOut + ToSSIRepairOut + PhyZeroReplaceOut + PhyChangeReplaceOut + PhyReplaceCompanyOut + PhyCNOut + PhyRepairCompanyOut + PhyReplaceCustOut ) - ( VirChangeReplaceOut + VirZeroReplaceOut + VirCNOut ) - ( TransferOutReturn + PhyReplaceCompanyIn + FromSSIRepairIn + PhyChangeReplaceIn + PhyReapirCompanyIn - VirChangeReplaceIn ) ) AS 'T.Out/Service',
( (SELECT CASE
WHEN Cast(Round(SUM(PVID.UnitNLC) / Count(PVID.UnitNLC), 0) AS INTEGER) IS NULL THEN 0
ELSE Cast(Round(SUM(PVID.UnitNLC) / Count(PVID.UnitNLC), 0) AS INT)
END
FROM SanketSales.dbo.pur_vir_inw_det PVID
WHERE I.ItemID = PVID.ItemID) * ( ( V.OpeningStock + PurchaseVirtual + SalesReturnVirtual + VirChangeReplaceIn + VirBranchTransIn ) - ( SalesVirtual + PurchaseReturnVirtual + VirZeroReplaceOut + VirChangeReplaceOut + VirCNOut + PVCNOut + VirBranchTransOut ) ) ) AS 'Stock Value(On AVG.NLC)',
(SELECT TOP 1 Cast(Round(PVID.UnitNLC, 0) AS INT)
FROM SanketSales.dbo.pur_vir_inw_det PVID
LEFT JOIN SanketSales.dbo.pur_vir_inw_mst PVIM
ON ( PVIM.VPINo = PVID.VPINo )
WHERE I.ItemID = PVID.ItemID
ORDER BY PVIM.Date DESC) AS 'Last NLC',
(SELECT TOP 1 Cast(Round(SUM(PVID.UnitNLC) / Count(PVID.UnitNLC), 0) AS INT)
FROM SanketSales.dbo.pur_vir_inw_det PVID
WHERE I.ItemID = PVID.ItemID) AS 'AVG NLC',
(SELECT Cast(Round(ID.DP, 0) AS INT)
FROM SanketUniversal.dbo.itemprice ID
WHERE ID.ItemID = I.ItemID
AND ID.[Current] = 1) AS 'DP',
(SELECT TOP 1 Cast(Round(SUM(SVOD.Rate * SVOD.Qty) / SUM(SVOD.Qty), 0) AS INT)
FROM SanketSales.dbo.sales_vir_out_det SVOD
WHERE SVOD.ItemID = I.ItemID) AS 'Avg. Sales Value',
(SELECT TOP 1 SUM(SVOD.CurQty)
FROM SanketSales.dbo.sales_vir_out_det SVOD
LEFT JOIN SanketSales.dbo.sales_vir_out_mst SVOM
ON ( SVOM.SVONo = SVOD.SVONo )
WHERE SVOD.ItemID = I.ItemID
AND CONVERT(VARCHAR(10), SVOM.Date, 120) BETWEEN CONVERT(VARCHAR(10), DATEADD(d, -15, GETDATE()), 120) AND CONVERT(VARCHAR(10), GETDATE(), 120)) AS '15 Day Qty',
(SELECT TOP 1 SUM(SVOD.CurQty)
FROM SanketSales.dbo.sales_vir_out_det SVOD
LEFT JOIN SanketSales.dbo.sales_vir_out_mst SVOM
ON ( SVOM.SVONo = SVOD.SVONo )
WHERE SVOD.ItemID = I.ItemID
AND CONVERT(VARCHAR(10), SVOM.Date, 120) BETWEEN CONVERT(VARCHAR(10), DATEADD(d, -30, GETDATE()), 120) AND CONVERT(VARCHAR(10), DATEADD(d, -16, GETDATE()), 120)) AS '30 Day Qty',
(SELECT TOP 1 SUM(SVOD.CurQty)
FROM SanketSales.dbo.sales_vir_out_det SVOD
LEFT JOIN SanketSales.dbo.sales_vir_out_mst SVOM
ON ( SVOM.SVONo = SVOD.SVONo )
WHERE SVOD.ItemID = I.ItemID
AND CONVERT(VARCHAR(10), SVOM.Date, 120) BETWEEN CONVERT(VARCHAR(10), DATEADD(d, -90, GETDATE()), 120) AND CONVERT(VARCHAR(10), DATEADD(d, -31, GETDATE()), 120)) AS '90 Day Qty',
(SELECT TOP 1 SUM(SVOD.CurQty)
FROM SanketSales.dbo.sales_vir_out_det SVOD
LEFT JOIN SanketSales.dbo.sales_vir_out_mst SVOM
ON ( SVOM.SVONo = SVOD.SVONo )
WHERE SVOD.ItemID = I.ItemID
AND CONVERT(VARCHAR(10), SVOM.Date, 120) BETWEEN CONVERT(VARCHAR(10), DATEADD(d, -180, GETDATE()), 120) AND CONVERT(VARCHAR(10), DATEADD(d, -91, GETDATE()), 120)) AS '180 Day Qty',
CASE
WHEN ( B1.VirtualBlockStockCount = 1
OR B1.PhysicalBlockStockCount = 1 ) THEN 'Block'
ELSE 'UnBlock'
END AS 'BlockStatus'
FROM SanketUniversal.dbo.ItemMaster I
LEFT JOIN SanketSales.dbo.VirtualStock V
ON ( V.ItemID = I.ItemID )
LEFT OUTER JOIN SanketUniversal.dbo.ProductMaster PM
ON I.ProductId = PM.ProductId
LEFT OUTER JOIN SanketUniversal.dbo.TypeMaster TM
ON I.typeId = TM.TypeId
LEFT OUTER JOIN SanketUniversal.dbo.BrandMaster B
ON I.BrandID = B.BrandID
LEFT JOIN SanketSales.dbo.itemblock B1
ON ( I.ItemID = B1.ItemID )
WHERE I.ActiveItem = 1
ORDER BY I.ItemName