2012-09-18 2 views
1

un champ de type décimal doit être divisé en plages (intervalles), calculées différemment et ensuite additionnées.calcul différent pour différentes plages (intervalles) de valeur décimale

Ce problème concerne les valeurs de champs et non les lignes. Donc, pour un certain champ (fieldX) dans chaque ligne d'une table:

FieldX < 0.013   <----remain just FieldX 
FieldX >= 0.013 to 0.026 <----be multiplied with 50%. 
FieldX > 0.026   <----be omitted. 

Commentaire: Les exemples ci-dessous montrent des valeurs dans l'intervalle fermé fermé [0.013, 0.026] que l'expression est:

  • 0.013 + (FieldX - 0.013) * 0.5

Ensuite, ces plages (intervalles) ou des parties doit être additionnées.

cas Exemple:

FieldX  Result 
-0.12  -0.12 
-0.05  -0.05 
+0.05  +0.05         — mismatch with specification 
+0.011  +0.011 
+0.014  +0.0135 = (0.013 + (0.014-0.013)*50%) 
+0.021  +0.017 = (0.013 + (0.021-0.013)*50%) 
+0.026  +0.0195 = (0.013 + (0.026-0.013)*50%) 
+0.031  +0.0195 = (0.013 + (0.026-0.013)*50%) — mismatch with specification 

Je remettra un prix Nobel au génie qui résout!

+1

Votre exemple ne semble pas avoir de sens - 0,05 doit être égal à 0,05, mais vous avez dit * obmit * si> 0,026 –

+0

Le la valeur de 0,031 devrait être omise, n'est-ce pas? –

Répondre

0
SELECT SUM(CASE 
      WHEN FieldX < 0.013 THEN FieldX 
      WHEN FieldX <= 0.026 THEN 0.013 + 0.5 * (FieldX - 0.013) 
      ELSE      NULL 
      END) 
    FROM YourTable 

Les agrégats ignorent NULL, ce qui équivaut à omettre. Notez que pour SUM(), vous pouvez utiliser 0.0 à la place de NULL, mais pas pour COUNT ou AVG. L'autre façon d'ignorer les lignes est de les filtrer avec une clause WHERE, bien sûr:

SELECT SUM(CASE 
      WHEN FieldX < 0.013 THEN FieldX 
      WHEN FieldX <= 0.026 THEN 0.013 + 0.5 * (FieldX - 0.013) 
      END) 
    FROM YourTable 
WHERE FieldX <= 0.026 
0

Vous devriez être en mesure de le faire en utilisant un CASE Statement

SELECT *, 
     CASE 
      WHEN FieldX < 0.013 
       THEN FieldX 
      WHEN FieldX >= 0.013 and FieldX < 0.026 
       THEN 0.013 + (FieldX - 0.013) * .5 
      ... and so on 
     END 
FROM [Table] 
Questions connexes