2010-08-16 21 views
2

Celui-ci m'a bloqué rapidement.Mise à jour de chaque ligne d'un tableau avec les conditions de déclaration IF

données:

Month   Total   Impact Forecast 
------------------------------------------------ 
2010-04-01 45792.0000 1.0000 NULL 
2010-05-01 51789.0000 1.0000 NULL 
2010-06-01 58228.0000 1.0000 NULL 
2010-07-01 52956.5217 1.0000 NULL 
2010-08-01 53600.4700 0.8810 NULL 
2010-09-01 54257.8784 1.1838 NULL 
2010-10-01 55134.0669 1.0000 NULL 

Maintenant ce que je suis en train de faire est une boucle à travers le contenu actuel de la table et mettre à jour la colonne des prévisions à l'aide conditionnelle instructions IF comme suit:

If Impact = 1.0000 then forecast = (current month) total * Impact 
If Impact < 1.0000 then forecast = (month -1) total * Impact 
If Impact > 1.0000 then forecast = (month -2) total * Impact 

I J'ai pensé à utiliser l'instruction CASE, bien que le calcul de la prévision à l'aide des dates précédentes me soit revenu, je suppose que j'aurai besoin d'utiliser des instructions while et RBAR.

Très apprécié.

Répondre

1

Que diriez-vous ceci:

UPDATE [Table] 
SET 
    [Forecast] = [Impact] * CASE 
     WHEN [Impact] = 1.0000 THEN 
     (
      SELECT 
       [InnerTable].[Total] 
      FROM [Table] AS [InnerTable] 
      WHERE [InnerTable].[Month] = [Table].[Month] 
     ) 
     WHEN [Impact] < 1.0000 THEN 
     (
      SELECT 
       [InnerTable].[Total] 
      FROM [Table] AS [InnerTable] 
      WHERE [InnerTable].[Month] = DATEADD(month, -1, [Table].[Month]) 
     ) 
     ELSE 
     (
      SELECT 
       [InnerTable].[Total] 
      FROM [Table] AS [InnerTable] 
      WHERE [InnerTable].[Month] = DATEADD(month, -2, [Table].[Month]) 
     ) 
    END  
FROM [Table] 
+0

produit de mauvais résultats pour les lignes où Mois est 2010-08-01, 2010-09-01, et 2010-10-01 –

+0

@Daniel: Je pense que 'SET [Forecast] = CASE devrait être' SET [Forecast] = [Impact] * CASE. (En supposant que l'impact utilisé devrait toujours être celui du mois en cours, quel que soit le total du mois à utiliser.) –

+0

alors comment définir une prévision à = Impact * CAS? – Icementhols

1

Vous pouvez faire une déclaration combinée de fantaisie, mais je venais d'utiliser 3 déclarations de mise à jour distinctes:

UPDATE table 
SET forecast = (current month) total * Impact 
WHERE Impact = 1.0000 
GO 
UPDATE table 
SET forecast = (month -1) total * Impact 
WHERE Impact < 1.0000 
GO 
UPDATE table 
SET forecast = (month -2) total * Impact 
WHERE Impact > 1.0000 
GO 
+0

Syntaxe incorrecte près du mot clé 'current'; Syntaxe incorrecte près de «total»; Syntaxe incorrecte proche de 'total'. –

+0

Désolé, cette partie était pseudocode, copiée directement à partir de la question. Je pensais que vous étiez juste préoccupé par la syntaxe de l'IF, mais je peux voir maintenant que vous devez tirer des valeurs d'autres lignes, ce qui est beaucoup plus difficile. – BradC

3

essayez ceci:

DECLARE @YourTable table (MonthOf datetime, TotalOf numeric(9,4), Impact numeric(9,4), forecast numeric(9,4)) 

INSERT @YourTable VALUES('2010-04-01', 45792.0000, 1.0000, NULL) 
INSERT @YourTable VALUES('2010-05-01', 51789.0000, 1.0000, NULL) 
INSERT @YourTable VALUES('2010-06-01', 58228.0000, 1.0000, NULL) 
INSERT @YourTable VALUES('2010-07-01', 52956.5217, 1.0000, NULL) 
INSERT @YourTable VALUES('2010-08-01', 53600.4700, 0.8810, NULL) 
INSERT @YourTable VALUES('2010-09-01', 54257.8784, 1.1838, NULL) 
INSERT @YourTable VALUES('2010-10-01', 55134.0669, 1.0000, NULL) 

;WITH MonthValues AS 
(
    SELECT 
     DATEADD(month,DATEDIFF(month,0,MonthOf),0) AS MonthYear 
      ,SUM(TotalOf) TotalOf 
    FROM @YourTable 
    GROUP BY DATEADD(month,DATEDIFF(month,0,MonthOf),0) 
) 
UPDATE y 
    SET Forecast=CASE 
        WHEN Impact = 1.0000 then m1.TotalOf * Impact 
        WHEN Impact < 1.0000 then m2.TotalOf * Impact 
        WHEN Impact > 1.0000 then m3.TotalOf * Impact 
       END 
    FROM @YourTable      y 
     LEFT OUTER JOIN MonthValues m1 ON DATEADD(month,DATEDIFF(month,0,y.MonthOf),0)=m1.MonthYear 
     LEFT OUTER JOIN MonthValues m2 ON DATEADD(month,-1,DATEADD(month,DATEDIFF(month,0,y.MonthOf),0))=m2.MonthYear 
     LEFT OUTER JOIN MonthValues m3 ON DATEADD(month,-2,DATEADD(month,DATEDIFF(month,0,y.MonthOf),0))=m3.MonthYear 

SELECT * FROM @YourTable 

OUTPUT:

MonthOf     TotalOf  Impact forecast 
----------------------- ----------- ------- ----------- 
2010-04-01 00:00:00.000 45792.0000 1.0000 45792.0000 
2010-05-01 00:00:00.000 51789.0000 1.0000 51789.0000 
2010-06-01 00:00:00.000 58228.0000 1.0000 58228.0000 
2010-07-01 00:00:00.000 52956.5217 1.0000 52956.5217 
2010-08-01 00:00:00.000 53600.4700 0.8810 46654.6956 
2010-09-01 00:00:00.000 54257.8784 1.1838 62689.9304 
2010-10-01 00:00:00.000 55134.0669 1.0000 55134.0669 

(7 row(s) affected)