簡體   English   中英

將VBA函數移至SQL Server存儲過程

[英]Moving VBA function to SQL Server stored procedure

我在MS Access中運行了一些VBA代碼,我想將其“放大”到存儲過程。 它現在使用ADO來生成排名(荷蘭的PLAATS),但是我必須在SQL Server上進行此項工作。 誰能幫忙?

VBA中的代碼是:

Function InvullenUitslag()

    Dim MijnDb As Database
    Dim rsWEDS As Recordset
    Dim iCategorie As Integer
    Dim iPlaats As Integer
    Dim iExequo As Integer
    Dim dblTotaal As Double
    Dim iAantalDeelnemers As Byte

    Set MijnDb = DBEngine.Workspaces(0).Databases(0)
    Set rsWEDS = MijnDb.OpenRecordset("Q_UITSLAG")

    rsWEDS.MoveFirst

    If Not rsWEDS.EOF Then
        iCategorie = rsWEDS![CATEGORIEID]
        dblTotaal = -1
        iPlaats = 0
        iExequo = 0
        iAantalDeelnemers = 0
    End If

    While Not rsWEDS.EOF()
        If Not (iCategorie = rsWEDS![CATEGORIEID]) Then
            iPlaats = 1
            iExequo = 0
            iAantalDeelnemers = 1
        Else
            If Abs(dblTotaal - rsWEDS![iTOTAAL]) <= 0.0001 Then
                iExequo = iExequo + 1
                iAantalDeelnemers = iAantalDeelnemers + 1
            Else
                iPlaats = iPlaats + iExequo + 1
                iExequo = 0
                iAantalDeelnemers = iAantalDeelnemers + 1
           End If
        End If

        rsWEDS.Edit
        rsWEDS![PLAATS] = iPlaats
        rsWEDS![AANTALDEELNEMERS] = iAantalDeelnemers

        If iExequo > 0 Then
            rsWEDS![EXEQUO] = "*"
        End If

        rsWEDS.Update
        iCategorie = rsWEDS![CATEGORIEID]
        dblTotaal = rsWEDS![iTOTAAL]
        rsWEDS.MoveNext
    Wend

End Function

如果我理解正確,則需要基於總得分和划分(划分)級別對參與者進行排名。

我認為您需要使用帶有PARTITION BY子句的RANK()。 您的結果將如下所示:

declare @table table (
     Name nvarchar(50)
    ,[Level] nvarchar(1)
    ,ResultApparatus1 decimal(12,1)
    ,ResultApparatus2 decimal(12,1)
    ,TotalScore decimal(12,1)
)

insert into @table values ('Jimm','A',8.0,9.0,17.0)
insert into @table values ('Jack','A',7.2,8.4,15.6)
insert into @table values ('John','B',8.2,7.6,15.6)
insert into @table values ('Frank','B',8.2,7.6,15.6)
insert into @table values ('Mark','B',8.2,7.8,15.8)

select 
    *
    ,RANK() OVER (PARTITION BY [Level] ORDER BY [Level], TotalScore DESC) Position
from 
    @table

這將返回以下結果集:

Name    Level   ResultApparatus1    ResultApparatus2    TotalScore  Position
Jimm    A       8.0                 9.0                 17.0        1
Jack    A       7.2                 8.4                 15.6        2
Mark    B       8.2                 7.8                 15.8        1
John    B       8.2                 7.6                 15.6        2
Frank   B       8.2                 7.6                 15.6        2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM