This is bit complicated due to the relationship between Arrivals and Returns has been set only on
PartyId
. There's no exact relationship between specifc arrival and return.
At this moment i was able to achieve that by using below query:
DECLARE @Accounts TABLE(Partyid INT, Title NVARCHAR(250))
INSERT INTO @Accounts(Partyid, Title)
VALUES(225, 'Mushtaq'), (2211, 'Akram');
DECLARE @ArrivalMaster TABLE(ArrivalID INT, Adate DATETIME, RefDate DATETIME, PartyID INT)
INSERT INTO @ArrivalMaster(ArrivalID, Adate, RefDate, PartyID)
VALUES(1, '2019-09-24', '2019-09-24', 225), (2, '2019-09-25', '2019-09-25', 2211);
DECLARE @ArrivalDetails TABLE(ArrivalID INT, ItemID INT, ItemQty INT, ItemAMount INT)
INSERT INTO @ArrivalDetails(ArrivalID, ItemID, ItemQty, ItemAMount)
VALUES(1, 1, 10, 500), (1, 11, 25, 230), (2, 10, 45, 70), (2, 25, 1, 90), (2, 1, 5, 25);
DECLARE @ReturnMaster TABLE(ReturnID INT, REtDate DATETIME, RefDate DATETIME, PartyID INT)
INSERT INTO @ReturnMaster(ReturnID, REtDate, RefDate, PartyID)
VALUES(1, '2019-09-24', '2019-09-24', 225), (2, '2019-09-25', '2019-09-25', 2211);
DECLARE @ReturnDetails TABLE(ReturnID INT, ItemID INT, ItemQty INT, ItemAMount INT)
INSERT INTO @ReturnDetails(ReturnID, ItemID, ItemQty, ItemAMount)
VALUES(1, 50, 10, 250), (1, 51, 20, 350), (2, 50, 9, 70), (2, 51, 8, 60);
SELECT am.ArrivalID, am.Adate ArrivalDate, am.RefDate ArrivalRefDate, a.Partyid PartyTitle, rm.ReturnID, ad.ArrivalAmount, rd.ReturnAmount
FROM @Accounts a
LEFT JOIN @ArrivalMaster am ON a.Partyid = am.PartyID
LEFT JOIN (
SELECT ArrivalID, SUM(ItemAmount) ArrivalAmount
FROM @ArrivalDetails
GROUP BY ArrivalID
) ad ON am.ArrivalID = ad.ArrivalID
LEFT JOIN @ReturnMaster rm ON a.Partyid = rm.PartyID
LEFT JOIN (
SELECT ReturnID, SUM(ItemAMount) AS ReturnAmount
FROM @ReturnDetails
GROUP BY ReturnID
) rd ON rm.ReturnID = rd.ReturnID