3 votes

Comment minorer au lieu d'ajouter dans une fonction sql de type Sum() ?

J'ai une clause group by dans une requête sql et j'ai besoin d'utiliser une fonction aggregate pour soustraire toutes les valeurs de chaque groupe au lieu de les additionner comme avec la fonction Sum().

c'est-à-dire

SELECT Sum(A) 
FROM (  
  SELECT 2 AS A
  UNION 
  SELECT 1) AS t1

donc évaluera 2+1 et renverra 3.

J'ai besoin d'un moyen de faire en sorte que 2-1 renvoie 1.

J'espère que cela a du sens. La seule façon d'y parvenir serait d'utiliser l'intégration CLR pour créer ma propre fonction d'agrégation.

D'autres idées ?

2voto

Unsliced Points 5800

Comment identifierez-vous l'élément à soustraire ?

Une fois qu'ils ont été identifiés, il s'agit d'une SUM() multiplié par -1 et ajoutée à cette valeur.

Edita:

S'il s'agit de la première valeur à soustraire, on prend cette valeur, on la double, puis on enlève la somme de toutes les valeurs. (Le fait de la doubler annule l'effet de l'inclure dans la somme de toutes les valeurs).

select top 1 @var = [value]
from myTable 
order by [some condition] 

select @minused = (2 * @var)  - sum([value]) 
from myTable

2voto

Ben Dowling Points 2849

Votre question n'indique pas clairement ce que vous voulez faire. Si vous souhaitez obtenir la somme de toutes les valeurs comme si elles étaient négatives, vous pouvez simplement effectuer un SUM(), et multiplier par -1 pour obtenir un résultat négatif.

Dans votre exemple, il semble que vous souhaitiez obtenir la somme de la première ligne du tableau, moins toutes les autres valeurs. Ainsi, si vous aviez les valeurs 10, 15, 5, 20, vous voudriez obtenir : 10 - 15 - 5 - 20. Cette valeur est identique à 10 - (15 + 5 + 20). Vous pouvez obtenir la première ligne d'un tableau en utilisant LIMIT. Nous aurons également besoin de la clé primaire pour l'étape suivante :

SELECT primary_key AS pk, field FROM table LIMIT 1;

Nous pouvons obtenir la somme de toutes les autres lignes en excluant la ligne ci-dessus :

SELECT SUM(field) FROM table WHERE primary_key != pk;

Vous pouvez ensuite soustraire la deuxième valeur de la première.

2voto

Steve Bosman Points 1085

En lisant vos commentaires, je pense que vous voulez quelque chose comme ça :

SELECT SUM(CASE WHEN ROWNUM=1 THEN 2*A ELSE -A END) 
FROM foo

Toutefois, pour obtenir une commande fiable, il vous faudra probablement utiliser un autre sélecteur :

SELECT SUM(b) 
FROM (
  SELECT CASE WHEN ROWNUM=1 THEN 2*a ELSE -a END AS b
  FROM foo
  ORDER BY ???
);

0voto

harriyott Points 6659

SUM() fonctionne, car 2+1 == 1+2, alors que 2-1 != 1-2, de sorte qu'une telle fonction produirait des résultats différents en cas de modification de ORDER BY, si elle devait exister.

0voto

FlySwat Points 61945

Je ne sais pas exactement pourquoi vous voulez faire cela, mais je ferais simplement la SOMME des valeurs négatives des données renvoyées :

SELECT Sum(A) 
FROM (  
  SELECT (2 * -1) AS A
  UNION 
  SELECT (1)) AS t1

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X