Условие Where на TransferDate
заменяет левое соединение на внутреннее соединение, перемещает его во On:
SELECT
TT.TransferRId, RM.ResourceName AS BookName,
COALESCE(Opening,0) AS Opening,
SUM(TT.InwardQty) AS Inward,
SUM(TT.OutwardQty) AS Outward,
COALESCE((Opening + (SUM(TT.InwardQty)) - (SUM(TT.OutwardQty))), 0) AS Closing
FROM
ResourceMaster RM
LEFT JOIN
TransferTrans TT ON TT.TransferRId = RM.ResourceId
LEFT JOIN
TransferRegister TR
ON TR.TransferRegisterId = TT.TransRegisterId
AND TR.TransferDate BETWEEN '2018-09-01' AND '2018-09-30'
LEFT JOIN
(SELECT
TT.TransferRId,
(SUM(TT.InwardQty)- SUM(TT.OutwardQty)) AS Opening
FROM
TransferTrans TT
LEFT JOIN
TransferRegister TR
ON TR.TransferRegisterId = TT.TransRegisterId
AND TR.TransferDate < '2018-09-01'
WHERE TT.Siteid = 2
GROUP BY
TT.TransferRId) AS Stock ON Stock.TransferRId = TT.TransferRId
WHERE
TT.Siteid = 2
GROUP BY
TT.TransferRId, RM.ResourceName, Opening
Существует эмпирическое правило, которое обычно подходит: условия на внешней таблице помещаются в WHERE
, тогда как условия на внутренней таблице AND
приводятся к условию соединения в ON