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) ... ?
3 Réponses :
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
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
Voyez ce que vous avez fait là-bas ... Nice :-)
@ Fraise je n'aime pas les conditions ;-)
... 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;