web-dev-qa-db-fra.com

Comment commander par un SUM () dans MySQL?

J'ai une table: "ID nom c_counts f_counts"

et je veux commander tous les enregistrements par sum(c_counts+f_counts) mais cela ne fonctionne pas:

SELECT * FROM table ORDER BY sum(c_counts+f_counts) LIMIT 20;

29
lovespring

N'oubliez pas que si vous mélangez des champs groupés (c.-à-d. SUM) et des champs non groupés, vous devez GROUPER PAR l'un des champs non groupés.

Essaye ça:

SELECT SUM(something) AS fieldname
FROM tablename
ORDER BY fieldname

Ou ca:

SELECT Field1, SUM(something) AS Field2
FROM tablename
GROUP BY Field1
ORDER BY Field2

Et vous pouvez toujours faire une requête dérivée comme celle-ci:

SELECT
   f1, f2
FROM
    (
        SELECT SUM(x+y) as f1, foo as F2
        FROM tablename 
        GROUP BY f2
    ) as table1
ORDER BY 
    f1

De nombreuses possibilités!

64
gahooa

Voilà comment vous le faites

SELECT ID,NAME, (C_COUNTS+F_COUNTS) AS SUM_COUNTS 
FROM TABLE 
ORDER BY SUM_COUNTS LIMIT 20

La fonction SUM additionnera toutes les lignes, donc le order by la clause est inutile, à la place vous devrez utiliser le group by clause.

8
Virat Kadaru

Vous pouvez essayer ceci:

SELECT * 
FROM table 
ORDER BY (c_counts+f_counts) 
LIMIT 20
4
DarkAjax

Sans clause GROUP BY, toute sommation regroupera toutes les lignes en une seule ligne, de sorte que votre requête ne fonctionnera pas. Si vous êtes regroupé par exemple par nom et trié par somme (c_counts + f_counts), vous obtiendrez peut-être des résultats utiles. Mais il faudrait grouper par quelque chose.

0
jrista

Le problème que je vois ici est que la "somme" est une fonction agrégée.

vous devez d'abord corriger la requête elle-même.

Select sum(c_counts + f_counts) total, [column to group sums by]
from table
group by [column to group sums by]

ensuite, vous pouvez le trier:

Select *
from (query above) a
order by total

EDIT: Mais voir le post de Virat. Peut-être que ce que vous voulez n'est pas la somme de vos champs totaux sur un groupe, mais juste la somme de ces champs pour chaque enregistrement. Dans ce cas, Virat a la bonne solution.

0
user158017