2010-07-13 5 views
2

i ont une table comme celui-ciSQL pour sommer seulement de nouvelles valeurs

NAME VALUE 
----------------- 
bla  1 
bla  2 
bla  2 
bla  3 
bla  1 
bla  4 
bla  2 

Comment puis-je faire une somme de valeurs seulement différentes, et ignorer les valeurs de répétition (est-il possible?)? Quelque chose comme ceci:

SELECT SUM(??condition?? value) as total FROM table 

Et la somme devrait être 10.

Merci!

+0

"SEULEMENT des valeurs différentes" Quels sont les critères de sélection? –

+0

La valeur dans la colonne de nom est-elle toujours la même? Que veux-tu arriver quand tu as des noms différents? –

Répondre

5

Cela devrait fonctionner:

SELECT SUM(value) as total FROM (SELECT DISTINCT value FROM table) tmp; 

Source: http://forums.mysql.com/read.php?97,203188,203787#msg-203787

SELECT SUM(DISTINCT value) as total FROM table 

Source: http://dev.mysql.com/doc/refman/5.1/en/group-by-functions.html#function_sum

La deuxième solution est préférable car il ne crée pas de table temporaire. Donc c'est plus rapide.

+0

+1 oui car la clause FROM est exécutée avant SELECT là. – Sarfraz

+0

Les deux solutions que vous avez postées ne sont pas équivalentes en général, alors dire que l'une est plus rapide que l'autre n'est pas vraiment une bonne raison de choisir entre elles. Ils donneront des résultats différents lorsque le nom n'est pas un champ constant. –

+0

vous pourriez raccourcir la première sous-requête à "SELECT DISTINCT valeur FROM table", non? – potatopeelings

6

Ne serait-

SELECT SUM(DISTINCT value) FROM mytable; 

faire l'affaire?

+0

vôtre est bon, mais MartyIX a été le premier à poster :) alors je lui ai donné le chèque :) –

+0

+1 de moi parce que vous étiez le premier à donner une ** réponse ** correcte (l'autre réponse a été éditée dans le 5 limite de minutes, mais c'était après que vous aviez déjà posté votre réponse, donc vous étiez le premier). –

4

Si vous voulez résumer toutes les valeurs distinctes, vous pouvez utiliser DISTINCT:

SELECT SUM(DISTINCT value) AS total FROM yourtable 

Si vous voulez calculer une somme différente pour chaque nom puis ajoutez GROUP BY:

SELECT name, SUM(DISTINCT value) AS total 
FROM yourtable 
GROUP BY name 

Ou ne considérer qu'un nom spécifique:

SELECT SUM(DISTINCT value) AS total 
FROM yourtable 
WHERE name = 'bla' 
Questions connexes