0
votes

La valeur positive ou négative dépend de la relation - Possibilité de SELECT SUM (...) dans une seule instruction?

Chaque ligne du tableau assets contient les champs value et type . Le champ type est une relation avec la table types où chaque ligne a un champ is_negative :

// assets
id  |  value  |  type
----------------------
 1  |   10    |   1
 2  |    4    |   2
 3  |    1    |   NULL


// types   
id  |  is_negative  
------------------
 1  |    0    
 2  |    1    

Je voudrais interroger la somme de toutes les valeurs d'actif où le type spécifie si la valeur est négative ou positive. Les éléments sans type doivent avoir une valeur négative.

Dans l'exemple ci-dessus, le résultat doit être 10 - 4 - 1 = 5

Est-ce possible d'une manière ou d'une autre? dans une seule instruction SELECT SUM (value) ... ?


0 commentaires

3 Réponses :


2
votes

Oui, assez facilement.

SELECT SUM(IF(is_negative = 1 OR is_negative IS NULL, value * -1, value))
FROM assets a
LEFT JOIN types t ON a.type = t.id


0 commentaires

2
votes

Une manière délicate (éviter les conditions):

select sum(value * case when not is_negative then 1 else -1 end)
from assets a
left join types t on t.id = a.type;

Une autre manière (plus lisible):

select sum( value * (0.5 - coalesce(t.is_negative, 1)) * 2 )
from assets a
left join types t on t.id = a.type


2 commentaires

Voyez ce que vous avez fait là-bas ... Nice :-)


@ Fraise je n'aime pas les conditions ;-)



2
votes

... ou très similaire ...

 SELECT SUM(CASE WHEN COALESCE(is_negative,1)= 1 THEN value * -1 ELSE value END) x 
   FROM assets x 
   LEFT 
   JOIN types y
     ON y.id = x.type;


0 commentaires