在sql中优化查询

在sql中优化查询,sql,sql-server,Sql,Sql Server,我有下面的算法 For R = FirstRowDBABACUS To LastRowDBABACUS ' R = Remboursement LastInterestDate = "" Do While Sheets("CI").Cells(R, 10).Value <> 0 For Inte = FirstRowDBABACUS To LastRowDBABACUS 'On commence par l'intérêt

我有下面的算法

For R = FirstRowDBABACUS To LastRowDBABACUS ' R = Remboursement
    LastInterestDate = ""
    Do While Sheets("CI").Cells(R, 10).Value <> 0
        For Inte = FirstRowDBABACUS To LastRowDBABACUS
            'On commence par l'intérêt
            If Sheets("CI").Cells(Inte, 3).Value <= DateArrete Then
                LastInterestDate = "R" & Inte & "C" & 3
                If Sheets("CI").Cells(Inte, 8).Value <> 0 Then
                    If Sheets("CI").Cells(R, 10).Value > Sheets("CI").Cells(Inte, 8).Value Then
                        'Modification du montant de Remboursement residuel
                        Sheets("CI").Cells(R, 10).Value = Sheets("CI").Cells(R, 10).Value - Sheets("CI").Cells(Inte, 8)
                        Sheets(RapproSheetName).Cells(Inte, 12).Value = Sheets(RapproSheetName).Cells(Inte, 8).Value
                        Sheets("CI").Cells(Inte, 8).Value = 0
                    Else
                        'Le montant ne suffit pas pour les intérêts
                        Sheets(RapproSheetName).Cells(Inte, 12).Value = Sheets(RapproSheetName).Cells(Inte, 12).Value + Sheets("CI").Cells(R, 10).Value
                        Sheets("CI").Cells(Inte, 8).Value = Sheets("CI").Cells(Inte, 8).Value - Sheets("CI").Cells(R, 10).Value
                        Sheets("CI").Cells(R, 10).Value = 0
                        Exit For
                    End If
                End If
                'Principal s'il reste quelque chose
                If Sheets("CI").Cells(R, 10).Value <> 0 Then
                    If Sheets("CI").Cells(Inte, 9) <> 0 Then
                        If Sheets("CI").Cells(R, 10).Value > Sheets("CI").Cells(Inte, 9).Value Then
                            'Modification du montant de Remboursement residuel
                            Sheets("CI").Cells(R, 10).Value = Sheets("CI").Cells(R, 10).Value - Sheets("CI").Cells(Inte, 9)
                            Sheets(RapproSheetName).Cells(Inte, 11).Value = Sheets(RapproSheetName).Cells(Inte, 9).Value
                            Sheets("CI").Cells(Inte, 9).Value = 0
                        Else
                            'Le montant ne suffit pas pour le remboursmeent du principal
                            Sheets(RapproSheetName).Cells(Inte, 11).Value = Sheets(RapproSheetName).Cells(Inte, 11).Value + Sheets("CI").Cells(R, 10).Value
                            Sheets("CI").Cells(Inte, 9).Value = Sheets("CI").Cells(Inte, 9).Value - Sheets("CI").Cells(R, 10).Value
                            Sheets("CI").Cells(R, 10).Value = 0
                            Exit For
                        End If
                    End If
                End If
            Else

            End If
        Next Inte
R=FirstRowDBABACUS到LastRowDBABACUS的R=Remboursement的

LastInterestDate=“”
Do While表格(“CI”)。单元格(R,10)。值0
对于Inte=FirstRowDBABACUS到LastRowDBABACUS
从“开始”开始
如果表格(“CI”).单元格(Inte,3).值表格(“CI”).单元格(Inte,8).值,则
“蒙塔特德伦布尔公寓改造工程”
表格(“CI”)。单元格(R,10)。数值=表格(“CI”)。单元格(R,10)。数值-表格(“CI”)。单元格(Inte,8)
工作表(RapproSheetName).单元格(Inte,12).值=工作表(RapproSheetName).单元格(Inte,8).值
表(“CI”)。单元格(Inte,8)。值=0
其他的
“这山就够了
表格(RapproSheetName)。单元格(Inte,12)。值=表格(RapproSheetName)。单元格(Inte,12)。值+表格(“CI”)。单元格(R,10)。值
表格(“CI”).单元格(Inte,8).值=表格(“CI”).单元格(Inte,8).值-表格(“CI”).单元格(R,10).值
表(“CI”)。单元格(R,10)。值=0
退出
如果结束
如果结束
“校长”s'il reste quelque选择了
如果表(“CI”)。单元格(R,10)。值为0,则
如果表(“CI”)。单元格(Inte,9)为0,则
如果表格(“CI”).单元格(R,10).值>表格(“CI”).单元格(Inte,9).值,则
“蒙塔特德伦布尔公寓改造工程”
表格(“CI”)。单元格(R,10)。数值=表格(“CI”)。单元格(R,10)。数值-表格(“CI”)。单元格(Inte,9)
工作表(RapproSheetName).单元格(Inte,11).值=工作表(RapproSheetName).单元格(Inte,9).值
表(“CI”)。单元格(Inte,9)。值=0
其他的
“在校长的回忆中,这山就足够了
表格(RapproSheetName)。单元格(Inte,11)。值=表格(RapproSheetName)。单元格(Inte,11)。值+表格(“CI”)。单元格(R,10)。值
表格(“CI”).单元格(Inte,9).值=表格(“CI”).单元格(Inte,9).值-表格(“CI”).单元格(R,10).值
表(“CI”)。单元格(R,10)。值=0
退出
如果结束
如果结束
如果结束
其他的
如果结束
下一个Inte
我正在尝试编写一个sql代码,它需要太长的时间和错误的结果

>   declare @RefAbacus as nvarchar(100)
>     set @RefAbacus ='002-00000001'
>     SELECT
>       RowNum = ROW_NUMBER() OVER (
>       ORDER BY [RefAbacus]),
>       * INTO #CI
>     FROM [CI]
>     WHERE [RefAbacus] = @RefAbacus
>     order by date, TypeOperation
>     SELECT
>       RowNum = ROW_NUMBER() OVER (
>       ORDER BY [RefAbacus]),
>       * INTO #DBRapproEchRemb
>     FROM [DBTmpRapproEchRemb]
>     WHERE [RefAbacus] =@RefAbacus
>     order by date, TypeOperation
>     
>     CREATE UNIQUE CLUSTERED INDEX IX_1 on #CI ([RefAbacus], RowNum)
>     CREATE UNIQUE CLUSTERED INDEX IX_2 on #DBRapproEchRemb ([RefAbacus], RowNum)
>     --declaration des variables
>     DECLARE @MaxRownum int
>     SET @MaxRownum = (SELECT
>       MAX(RowNum)
>     FROM #CI) -----------------------
>     DECLARE @MinRownum int
>     SET @MinRownum = (SELECT
>       MIN(RowNum)
>     FROM #CI)
>     
>     DECLARE @FR int;
>     DECLARE @LR int;
>     DECLARE @inte int;
>     DECLARE @R int;
>     DECLARE @remboursement AS float
>     DECLARE @LastInterestDate AS nvarchar(50);
>     DECLARE @i int;
>     DECLARE @TolerancePart int;
>     
>     SET @FR = @MinRownum
>     SET @LR = @MaxRownum
>     SET @TolerancePart = 5;
>     ----------------------------------------------------
>     
>     SET @R = (SELECT
>       MIN(RowNum)
>     FROM #CI)
>     SET @inte = (SELECT
>       MIN(RowNum)
>     FROM #CI)
>     
>     
>           WHILE @R <= @MaxRownum
>               BEGIN
>               
>                   while  (SELECT [Remboursement] FROM #CI WHERE RowNum = @R ) <>0  and   (SELECT [Remboursement] FROM #CI WHERE RowNum = @R ) IS NOT
> NULL
>                   begin
>                   SET @LastInterestDate = ''
>                   SET @inte = (SELECT
>                     MIN(RowNum)
>                   FROM #CI)-1
>                       WHILE @inte <= @MaxRownum
>                           BEGIN -- run your operation here
>                       --print @inte
>                           -- Condition 1
>                               SET @inte = @inte + 1;
>                           IF (SELECT Date FROM #CI WHERE RowNum = @inte)<= CONVERT(date, GETDATE())
>     
>                               BEGIN
>                               SET @LastInterestDate = 'R' + CONVERT(nvarchar(50), @inte) + 'C3'
>     
>                               -- Condition 2
>                               IF ((SELECT EchInteret FROM #CI
>                               WHERE RowNum = @inte) <> 0)
>                                   BEGIN
>                           
>                                   -- Condition 3 
>                                   IF ((SELECT [Remboursement] FROM #CI 
>                                   WHERE RowNum = @R) > (SELECT EchInteret FROM #CI
>                                   WHERE RowNum = @inte))
>                                       BEGIN ---------------------------------------
>                                       -- Update 1
>                                       print 'Update 1'
>                                       UPDATE #CI
>                                       SET [Remboursement] = R.[Remboursement] - isnull(INTE.EchInteret,0)
>                                       FROM (SELECT * FROM #CI
>                                       WHERE RowNum = @inte) INTE INNER JOIN (SELECT  * FROM #CI
>                                       WHERE RowNum = @R) R
>                                       ON R.RefAbacus = INTE.RefAbacus WHERE #CI.RowNum = @R; 
>                               
>                                       -- Update 2
>                                       UPDATE #CI
>                                       SET EchInteret = 0
>                                       FROM (SELECT * FROM #CI
>                                       WHERE RowNum = @inte) INTE INNER JOIN (SELECT  * FROM #CI
>                                       WHERE RowNum = @R) R ON R.RefAbacus = INTE.RefAbacus
>                                       WHERE #CI.RowNum = @inte; 
>                                   
>                                       UPDATE #DBRapproEchRemb
>                                       SET [PartEnInterêt] = isnull(EchInteret,0)
>                                       WHERE RowNum = @inte;
>     
>     
>                                       --SET @inte = @inte + 1;
>                                       END
>                                       ELSE -------------------------
>                                       -- Update 3
>                                       BEGIN
>     
>                                       UPDATE #DBRapproEchRemb
>                                       SET [PartEnInterêt] = isnull(INTE.[PartEnInterêt],0) + R.Remboursement
>                                       FROM (SELECT * FROM #CI
>                                       WHERE RowNum = @R) R
>                                       INNER JOIN (SELECT * FROM #DBRapproEchRemb
>                                       WHERE RowNum = @inte) INTE ON R.RefAbacus = INTE.RefAbacus
>                                       WHERE #DBRapproEchRemb.RowNum = @inte;
>     
>     
>                                       UPDATE #CI
>                                       SET EchInteret = isnull(INTE.EchInteret,0) - R.Remboursement
>                                       FROM (SELECT * FROM #CI
>                                       WHERE RowNum = @R) R INNER JOIN (SELECT * FROM #CI
>                                       WHERE RowNum = @inte) INTE ON R.RefAbacus = INTE.RefAbacus
>                                       WHERE #CI.RowNum = @inte;
>     
>                                       print 'ok'
>                                       UPDATE #CI
>                                       SET Remboursement = 0
>                                       WHERE #CI.RowNum = @R;
>     
>                                       --------------------------------------------
>                                       BREAK
>                                       END
>                                   END
>     
>                                   -- Condition 4 
>                                   IF ((SELECT [Remboursement]FROM #CI
>                                   WHERE RowNum = @R) <> 0)
>     
>                                   BEGIN
>                                   -- Condition 5
>                                   IF ((SELECT EchPrincial FROM #CI
>                                   WHERE RowNum = @inte) <> 0)
>     
>                                       BEGIN
>                                   
>                                       -- Condition 6
>                                       IF ((SELECT [Remboursement] FROM #CI
>                                       WHERE RowNum = @R) > (SELECT EchPrincial FROM #CI
>                                       WHERE RowNum = @inte))
>     
>                                           -- Update 4
>     
>                                           BEGIN
>                                           ----------------------------
>                                           
>                                           UPDATE #CI
>                                           SET [Remboursement] = R.[Remboursement] - isnull(INTE.EchPrincial,0)
>                                           FROM (SELECT*FROM #CI
>                                           WHERE RowNum = @inte) INTE INNER JOIN (SELECT * FROM #CI
>                                           WHERE RowNum = @R) R ON R.RefAbacus = INTE.RefAbacus
>                                           WHERE #CI.RowNum = @R;
>                                       
>                                           UPDATE #DBRapproEchRemb
>                                           SET PartEnPrincipal =isnull( EchPrincial,0)
>                                           WHERE RowNum = @inte;
>     
>     
>                                           UPDATE #CI
>                                           SET EchPrincial = 0
>                                           WHERE #CI.RowNum = @inte;
>                                           print' avant break'
>     
>                                           END
>                                           -----------
>                                       ELSE
>                                           -- Update 5
>                                           BEGIN
>                                       
>     
>                                           UPDATE INTE
>                                           SET PartEnPrincipal = isnull(inte.PartEnPrincipal,0) + R.Remboursement
>                                           FROM (SELECT * from #DBRapproEchRemb 
>                                            WHERE RowNum = @inte)INTE INNER JOIN (SELECT * FROM #CI
>                                           WHERE RowNum = @R) R ON R.RefAbacus = INTE.RefAbacus
>                                           WHERE INTE.RowNum = @inte;
>     
>     
>                                           UPDATE INTE
>                                           SET EchPrincial = inte.EchPrincial + R.Remboursement
>                                           FROM #CI
>                                           INTE INNER JOIN (SELECT * FROM #CI
>                                           WHERE RowNum = @R) R ON R.RefAbacus = INTE.RefAbacus
>                                           WHERE INTE.RowNum = @inte;
>     
>     
>                                           UPDATE #CI
>                                           SET Remboursement = 0
>                                           WHERE #CI.RowNum = @R;
>                                           print 'apres break'
>                                           
>                                           BREAK
>                                           END
>                                       END
>     
>                               END
>     
>                           END
>                   
>                           end
>     
>               END
>                   SET @R = @R + 1;
>           END
>将@RefAbacus声明为nvarchar(100)
>设置@RefAbacus='002-00000001'
>挑选
>RowNum=上的行数()(
>[RefAbacus]的命令,
>*进入#CI
>来自[CI]
>其中[RefAbacus]=@RefAbacus
>按日期、类型操作订购
>挑选
>RowNum=上的行数()(
>[RefAbacus]的命令,
>*进入#DBRapproEchRemb
>来自[DBTmpRapproEchRemb]
>其中[RefAbacus]=@RefAbacus
>按日期、类型操作订购
>     
>在#CI([RefAbacus],RowNum)上创建唯一的聚集索引IX_1
>在#DBRapproEchRemb([RefAbacus],RowNum)上创建唯一的聚集索引IX#u 2
>--变量声明
>声明@MaxRownum int
>设置@MaxRownum=(选择
>最大值(行数)
>来自#CI)-----------------------
>声明@MinRownum int
>设置@MinRownum=(选择
>最小值(RowNum)
>来自#CI)
>     
>声明@FR int;
>声明@LR int;
>声明@inte int;
>声明@R int;
>宣布@remboursement为浮动
>声明@LastInterestDate为nvarchar(50);
>声明@i int;
>声明@公差部分int;
>     
>设置@FR=@MinRownum
>设置@LR=@MaxRownum
>设置@公差部分=5;
>     ----------------------------------------------------
>     
>设置@R=(选择
>最小值(RowNum)
>来自#CI)
>设置@inte=(选择
>最小值(RowNum)
>来自#CI)
>     
>     
>当@R开始时
>               
>而(从#CI中选择[Remboursement],其中RowNum=@R)0和(从#CI中选择[Remboursement],其中RowNum=@R)不可用
>空的
>开始
>设置@LastInterestDate=“”
>设置@inte=(选择
>最小值(RowNum)
>来自#CI)-1
>而@inte BEGIN--在此处运行您的操作
>--打印@inte
>--条件1
>设置@inte=@inte+1;
>IF(从#CI中选择日期,其中RowNum=@inte)
>开始
>SET@LastInterestDate='R'+转换(nvarchar(50),@inte)+'C3'
>     
>--条件2
>如果((从#CI中选择eCInteret
>其中RowNum=@inte)0)
>开始
>                           
>--条件3
>如果((从#CI中选择[薪酬])
>其中RowNum=@R)>(从#CI中选择EchInteret
>其中RowNum=@inte))
>开始---------------------------------------
>--更新1
>打印“更新1”
>更新#CI
>SET[Remboursement]=R[Remboursement]-isnull(INTE.EchInteret,0)
>从(选择*从#CI
>其中RowNum=@inte)inte-INNER-JOIN(从#CI中选择*
>