2017-08-22 65 views
0

在下面的代碼中,我的目標是讀取有關另一個表中的人的某些信息,然後執行計算,然後將結果插入另一個表中。在將值插入第二個表之前,需要掃描整個表格執行相同的計算。當我運行的代碼,在點22獲得插在積分榜甚至認爲有各種ranks.below是我的代碼:在TSQL計算中似乎存在邏輯錯誤

DECLARE @PID NCHAR(4), @rank nvarchar(20),@JoinDate datetime,@Amt int, 
    @LengthOfService int,@RowNum int 
    select @PID=Max(No_) from dbo.Person 
    select @RowNum=COUNT(*)FROM dbo.Person 
    select @JoinDate=[Employment Date] from dbo.Person where [email protected] 
    select @rank=Grade from dbo.Personwhere where [email protected] 
    While @RowNum>0 
    BEGIN 
     IF(@rank='Point01' OR @rank='Point02') 
    BEGIN 
    SET @Amt=10 
    END 
    ELSE if(@rank='Point03') 
    BEGIN 
    set @Amt=5 
    END 
    ELSE IF(@rank='Point04' OR @rank='Point05') 
    BEGIN 
    set @Amt=22 
    END 

    INSERT INTO dbo.Scores(EmpID,total) 
     VALUES(@PID,@Amt) 
     set @RowNum = @RowNum - 1 

    END 
+1

爲什麼不直接寫一個'INSERT SELECT'語句?爲什麼循環以及爲什麼'triggers'標籤?你不是 –

+2

這是[XY問題]的一個例子(https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。你有一個問題X,計算某種等級。你認爲你需要循環來做到這一點(你不需要),當你遇到麻煩時,你會詢問循環,而不是*實際*問題。你想要計算什麼? Post示例源數據和結果數據 –

+0

BTW SQL Server有許多排名函數,如ROW_NUMBER,RANK,DENSE_RANK,NTILE等。您可以使用'OVER'子句計算正在運行的聚合。您可以* JOIN *兩個表來獲得匹配的行。您可以在SUM中使用'CASE'子句將文本數據轉換爲數字,但加入查詢表會更容易。無論您想要做什麼,都不需要循環和所有這些變量 –

回答

0

我想,你可以得到預期的輸出僅使用一個select語句沒有必要while循環和額外參數。選中 -

 INSERT INTO dbo.Scores(EmpID,total) 
     select max(p.no) over (partition by p.no order by p.no desc) as EmpId, 
       case WHEN grade='Point01' OR grade='Point02' THEN 10 
        WHEN grade='Point03' THEN 5 
        WHEN grade='Point04' OR grade='Point05' THEN 22 END as Amt 
     FROM person p, personwhere pw 
     WHERE p.no =pw.no