2017-08-22 1 views
0

Dans le code ci-dessous, mon but est de lire certaines informations sur la personne dans une autre table, puis d'effectuer le calcul puis d'insérer le résultat dans une autre table. Ce besoin de scanner toute la table effectue le même calcul avant d'insérer les valeurs dans la seconde table. Quand je lance le code, sur le point 22 s'inséré dans le tableau des scores même pensé il y a différents ranks.below est mon code:Il semble y avoir une erreur logique dans TSQL Computation

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

Pourquoi ne pas simplement écrire une instruction INSERT SELECT? Pourquoi la boucle et pourquoi le tag 'triggers'? Vous ne le faites pas non plus –

+2

Ceci est un cas du [problème XY] (https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). Vous avez un problème X, en calculant une sorte de rang. Vous pensez que vous avez besoin de boucles pour le faire (vous ne le faites pas) et quand vous avez des ennuis vous posez des questions sur les boucles, pas le problème * réel *. Qu'essayez-vous de calculer? Exemple de publication de source et de résultat –

+0

BTW SQL Server dispose de nombreuses fonctions de classement telles que ROW_NUMBER, RANK, DENSE_RANK, NTILE, etc. Vous pouvez utiliser la clause 'OVER' pour calculer les agrégats en cours d'exécution. Vous pouvez * JOIN * deux tables pour obtenir des lignes correspondantes. Vous pouvez utiliser une clause 'CASE' dans un' SUM' pour convertir des données textuelles en nombres, bien qu'il soit plus facile de se joindre à une table de recherche. Quoi que vous voulez faire, ne nécessite pas de boucles et toutes ces variables –

Répondre

0

Je pense, vous pouvez vous attendre la sortie en utilisant une seule instruction select pas besoin de la boucle while et des paramètres supplémentaires. Cochez cette case -

 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