IF OBJECT_ID('TempDB..#tblInv','U') IS NOT NULLDROP TABLE #tblInvCREATE TABLE #tblInv(ID INT ,PartNo VARCHAR(10) NOT NULL,TranType VARCHAR(7) NOT NULL,Quantity INT NOT NULL)insert into #tblInv(id,partno, TranType,quantity)select 1, 'A', 'buy', 50 union allselect 2,'A', 'buy', 50 union allselect 3,'A', 'buy', 50 union allselect 4,'A', 'buy', 50 union allselect 5,'A', 'buy', 100 union allselect 6,'A', 'sell', 150 union allselect 7,'A', 'sell', 100 union allselect 8,'A', 'buy', 500 union allselect 9,'A', 'sell', 450 union allselect 10,'A' ,'buy', 450 union allselect 11,'A', 'sell', 550 union allselect 12,'B', 'buy', 300 union allselect 13,'B', 'sell', 200 union allselect 14,'B' ,'buy', 200 union allselect 15,'B', 'sell', 250 union allselect 16, 'B', 'sell', 250select * from #tblInv
IF OBJECT_ID('TempDB..#tblInv','U') IS NOT NULLDROP TABLE #tblInvCREATE TABLE #tblInv(ID INT ,PartNo VARCHAR(10) NOT NULL,TranType VARCHAR(7) NOT NULL,Quantity INT NOT NULL)insert into #tblInv(id,partno, TranType,quantity)select 1, 'A', 'buy', 50 union allselect 2,'A', 'buy', 50 union allselect 3,'A', 'buy', 50 union allselect 4,'A', 'buy', 50 union allselect 5,'A', 'buy', 100 union allselect 6,'A', 'sell', 150 union allselect 7,'A', 'sell', 100 union allselect 8,'A', 'buy', 500 union allselect 9,'A', 'sell', 450 union allselect 10,'A' ,'buy', 450 union allselect 11,'A', 'sell', 550 union allselect 12,'B', 'buy', 300 union allselect 13,'B', 'sell', 200 union allselect 14,'B' ,'buy', 200 union allselect 15,'B', 'sell', 250 union allselect 16, 'B', 'sell', 250select * from #tblInvSELECT COALESCE(b.id,s.id) AS id, COALESCE(b.id,0) AS bid, COALESCE(b.partno,s.partno) AS partno, COALESCE(b.TranType,s.TranType) AS TranType, COALESCE(b.quantity,0) AS bquantity, COALESCE(s.id,0) AS [sid], COALESCE(s.quantity,0) AS squantityFROM ( SELECT ROW_NUMBER() OVER( PARTITION BY partno ORDER BY id ) AS rowid, * FROM #tblInv WHERE TranType = 'buy' ) b FULL OUTER JOIN ( SELECT ROW_NUMBER() OVER( PARTITION BY partno ORDER BY id ) AS rowid, * FROM #tblInv WHERE TranType = 'sell' ) s ON b.partno = s.partno AND b.rowid = s.rowid
IF OBJECT_ID('TempDB..#tblInv','U') IS NOT NULLDROP TABLE #tblInvCREATE TABLE #tblInv(ID INT,PartNo VARCHAR(10) NOT NULL,TranType VARCHAR(7) NOT NULL,Quantity INT NOT NULL,PRIMARY KEY CLUSTERED(PartNo, TranType, ID),RN INT,BSOrder INT)INSERT INTO #tblInv(id,partno, TranType,quantity)SELECT 1, 'A', 'buy', 50 UNION ALLSELECT 2,'A', 'buy', 50 UNION ALLSELECT 3,'A', 'buy', 50 UNION ALLSELECT 4,'A', 'buy', 50 UNION ALLSELECT 5,'A', 'buy', 100 UNION ALLSELECT 6,'A', 'sell', 150 UNION ALLSELECT 7,'A', 'sell', 100 UNION ALLSELECT 8,'A', 'buy', 500 UNION ALLSELECT 9,'A', 'sell', 450 UNION ALLSELECT 10,'A' ,'buy', 450 UNION ALLSELECT 11,'A', 'sell', 550 UNION ALLSELECT 12,'B', 'buy', 300 UNION ALLSELECT 13,'B', 'sell', 200 UNION ALLSELECT 14,'B' ,'buy', 200 UNION ALLSELECT 15,'B', 'sell', 250 UNION ALLSELECT 16, 'B', 'sell', 250DECLARE @RN INT, @BSOrder INT, @ID INT, @LastPart VARCHAR(10), @LastType VARCHAR(7)SET @RN = 0SET @BSOrder = 1UPDATE #tblInvSET @RN = RN = @RN + 1, @BSOrder = BSOrder = CASE WHEN @LastPart = PartNo AND @LastType = TranType THEN @BSOrder + 1 ELSE 1 END, @LastPart = PartNo, @LastType = TranType, @ID = [ID] -- AnchorFROM #tblInv WITH (INDEX(0))SELECT COALESCE(B.RN, S.RN) RN, ISNULL(B.[ID],0) BID, COALESCE(B.PartNo,S.PartNo) PartNo, ISNULL(B.TranType,'-') TranType, ISNULL(B.Quantity,0) Quantity, ISNULL(S.[ID],0) SID, ISNULL(S.Quantity,0) sQuantityFROM (SELECT * FROM #tblInv WHERE TranType = 'buy') B FULL OUTER JOIN (SELECT * FROM #tblInv WHERE TranType = 'sell') S ON B.PartNo = S.PartNo AND B.BSOrder = S.BSOrderORDER BY COALESCE(B.RN, S.RN)