2017-08-22 12 views
0

以下のコードでは、私の目標は、別のテーブルの人に関する特定の情報を読み取り、計算を実行して別のテーブルに結果を挿入することです。テーブル全体を走査するこの必要性は、第2のテーブルに値を挿入する前に同じ計算を実行する。私は、コードを実行すると、ポイント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があります。あなたはそれをするためにループが必要だと思っています(あなたはそうしません)。そして、あなたが困ったときにループについて質問します。実際の問題ではありません。あなたは何を計算しようとしていますか?例のソースと結果のデータ –

+0

BTW SQL Serverには、ROW_NUMBER、RANK、DENSE_RANK、NTILEなどのランキング機能が多数あります。実行中の集計を計算するには、OVER句を使用できます。 * 2つのテーブルをジョインして、一致する行を取得することができます。ルックアップテーブルと結合する方が簡単ですが、テキストデータを数値に変換するには、 'SUM'の中で' CASE'節を使用することができます。あなたがしたいことは何でも、ループとそのすべての変数を必要としません –

答えて

0

私が思うに、あなただけの1つの選択ステートメントを使用して出力する必要はありません期待得ることができます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 
関連する問題