2009-07-28 7 views
3

Je suis désolé si c'est vraiment basique, mais:Est-ce que les fonctions agrégées MySQL retournent toujours une seule ligne?

Je sens qu'à un certain moment je n'ai pas eu ce problème, et maintenant je le suis, donc soit je faisais quelque chose de totalement différent avant ou ma syntaxe a sauté une étape.

J'ai, par exemple, une requête que j'ai besoin de retourner toutes les lignes avec certaines données avec une autre colonne qui a le total d'une de ces colonnes. Si les choses ont fonctionné comme je les attendais, il ressemblerait à ceci:

SELECT 
order_id, 
cost, 
part_id, 
SUM(cost) AS total 
FROM orders 
WHERE order_date BETWEEN xxx AND yyy 

Et je recevrais toutes les lignes avec mes ordres, avec le total clouée à la fin de chacun. Je sais que le total serait le même à chaque fois, mais c'est prévu. En ce moment, pour obtenir ce à travailler, je me sers:

SELECT 
order_id, 
cost, 
part_id, 
(SELECT SUM(cost) 
FROM orders 
WHERE order_date BETWEEN xxx AND yyy) AS total 
FROM orders 
WHERE order_date BETWEEN xxx AND yyy 

en cours d'exécution essentiellement la même requête deux fois, une fois pour le total, une fois pour les autres données. Mais si je voulais, par exemple, le SUM et, je ne sais pas, le coût moyen, je ferais alors la même requête 3 fois, et cela semble vraiment faux, c'est pourquoi je pense que je fais des choses vraiment basiques erreur.

Toute aide est vraiment appréciée.

+0

On dirait que vous obtenez de bonnes réponses, mais la question comme indiqué sous la forme d'une réponse par oui ou par non n'est pas un début très utile, à mon humble avis. – Smandoli

+0

J'ai tendance à écrire des questions qui ont un son très vague et qualitatif, donc c'était ma tentative d'être plus précis. Toujours un réglage fin. – Anthony

Répondre

6

Vous devez utiliser GROUP BY en tant que telle pour obtenir le résultat souhaité:

SELECT 
order_id, 
part_id, 
SUM(cost) AS total 
FROM orders 
WHERE order_date BETWEEN xxx AND yyy 
GROUP BY order_id, part_id 

Ce groupera vos résultats. Notez que puisque je suppose que order_id et part_id est un composé PK, SUM(cost) dans ce qui précède sera probablement = cost (puisque vous un regroupement par une combinaison de deux champs qui est garanti pour être unique.La sous-requête corrélée ci-dessous permettra de surmonter cette limitation).

Toute ligne non agrégée récupérée doit être spécifiée dans la ligne GROUP BY.

Pour plus d'informations, vous pouvez lire un tutoriel sur GROUP BY ici:

MySQL Tutorial - Group By


EDIT: Si vous souhaitez utiliser une colonne à la fois globale et non agréger, ou si vous devez désagréger vos groupes, vous devrez utiliser une sous-requête en tant que telle:

SELECT 
or1.order_id, 
or1.cost, 
or1.part_id, 
(
    SELECT SUM(cost) 
    FROM orders or2 
    WHERE or1.order_id = or2.order_id 
    GROUP BY or2.order_id 
) AS total 
FROM orders or1 
WHERE or1.order_date BETWEEN xxx AND yyy 
+0

Vous regroupez par coût, donc SUM (coût) ne fonctionnera pas. –

+0

** @ Rax Olgud: ** C'était moi copier et coller de l'original 'SELECT' sans vérifier les champs. L'erreur a été corrigée. –

+0

Et vous avez des droits d'édition. Pas besoin de détourner une réponse pour une simple faute de frappe. –

Questions connexes