Hi Guys,
I am trying to break a table that contains records accross in 40 columns and create multiple records out of the 40 columns record.
I have 2 Tables, TableA the one that has 40 Columns per Enrollment(Matricula) and the other TableB the one that only has 5 Columns which will store the multiple records broken down from the TableA
TableA = tblPayments
TableB = Payment_Details
Some how the records do not fall in the appropriate columns and this is the part where I am frustrated
SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO /* uspCalculateTimeSheet Syntax: spBreakDownPayments */ CREATE PROC [dbo].[spBreakDownPayments] AS DECLARE @Matricula varchar(50) DECLARE @LineCnt int DECLARE @sqlMethod NVARCHAR(4000) DECLARE @OPMethod NVARCHAR(50) DECLARE @sqlDate NVARCHAR(4000) DECLARE @OPDate NVARCHAR(50) DECLARE @sqlAmt NVARCHAR(4000) DECLARE @OPAmt NVARCHAR(50) DECLARE @TheMethod varchar(50) DECLARE @TheDate datetime DECLARE @TheAmount money SET @LineCnt=0 SET @TheAmount=0 DECLARE Cursor_Payments CURSOR FOR SELECT DISTINCT [Matricula] FROM [DBF_File].[dbo].[tblPayments] WHERE [Matricula] IS NOT NULL OPEN Cursor_Payments FETCH NEXT FROM Cursor_Payments INTO @Matricula WHILE @@FETCH_STATUS=0 BEGIN SET @LineCnt = @LineCnt +1 SET @sqlMethod = 'SELECT @TheMethod=method'+RTRIM(LTRIM(STR(@LineCnt)))+' FROM [DBF_Payments] WHERE [matricula]=@Matricula' EXEC sp_executesql @sqlMethod, N'@Matricula INT, @TheMethod NVARCHAR(50) OUTPUT',@Matricula = @Matricula, @TheMethod = @TheMethod OUTPUT ---SELECT @TheMethod=ISNULL(@OPMethod,'CASH') SET @sqlDate ='SELECT @TheDate=paiddate'+RTRIM(LTRIM(STR(@LineCnt)))+' FROM [DBF_Payments] WHERE [matricula]=@Matricula' EXEC sp_executesql @sqlDate, N'@Matricula INT, @TheDate NVARCHAR(50) OUTPUT',@Matricula = @Matricula, @TheDate = @TheDate OUTPUT ---SELECT @TheDate=TRY_CONVERT(DATETIME,@OPDate) SET @sqlAmt = 'SELECT @TheAmount=Amount'+RTRIM(LTRIM(STR(@LineCnt)))+' FROM [DBF_Payments] WHERE [matricula]=@Matricula' EXEC sp_executesql @sqlAmt, N'@Matricula INT, @TheAmount NVARCHAR(50) OUTPUT',@Matricula = @Matricula, @TheAmount = @TheAmount OUTPUT ---SELECT @TheAmount=ISNULL(TRY_CONVERT(MONEY,@OPAmt),0) ------------Append new record IF NOT EXISTS(select * from Payment_Details where [reference]=@Matricula and [method]=@TheMethod and MONTH([date_paid])=MONTH(@TheDate) and DAY([date_paid])=DAY(@TheDate) and YEAR([date_paid])=YEAR(@TheDate) and [amount_paid]=@TheAmount) BEGIN BEGIN TRANSACTION INSERT INTO [Payment_Details]([date_paid],[method],[amount_paid],[reference]) VALUES(@TheDate,@TheMethod,@TheAmount,@Matricula) COMMIT END ----Reset SET @TheMethod='' SET @TheDate=NULL SET @TheAmount=0.00 ---- It Reaches the columns count then go to the next IF (@LineCnt>=40) BEGIN SET @LineCnt = 0 END -----Next Record FETCH NEXT FROM Cursor_Payments INTO @Matricula END CLOSE Cursor_Payments Deallocate Cursor_Payments
Download the data and tables script -->"github.com/netstair/SQLBreakdownData/blob/main/DBF_File_Script_With_Data.sql"
Thank you in advanced.
Jose