2010-07-13 5 views
3

J'ai une instruction SQL comme ceci:Grouper par/distinct combiné avec la somme?

select a.id, a.valfrom ... 
    inner join ... 
    where ...; 

En conséquence, j'ai ceci:

id val 
--------- 
3  10 
3  10 
3  10 
9  21 
9  21 
11  2 
11  2 
13  30 

vous pouvez donc voir, un id a une valeur.

Si je fais un groupe par (a.id), je reçois:

id val 
--------- 
3  10 
9  21 
11  2 
13  30 

Ce que je veux obtenir du dernier résultat est la somme: 10 + 21 + 2 + 30 = 63.

Alors, comment puis-je obtenir la somme comme résultat unique? Si je fais une somme (a.val) et que j'utilise group by (a.id) je n'obtiens pas 63, j'obtiens la somme pour chaque identifiant, par exemple id = 3 -> 10 + 10 + 10 = 30.

Cordialement.

Répondre

8

Vous ne voulez pas un GROUP BY, alors. Vous ne pouvez pas non plus sélectionner l'ID correctement dans SQL standard. Vous voulez juste:

SELECT SUM(val) FROM (SELECT DISTINCT id, val FROM ...) AS foo

Mais, MySQL prend en charge quelques extensions à la syntaxe SQL standard qui peut faire ce travail:

SELECT DISTINCT id, SUM(val) FROM ...

+0

Sélectionnez parmi les select est égal à "boooooo". Grouper par est le chemin, mais avec quelque chose qu'ils ont tous en commun: le 'NULL'. Voir ma réponse –

+0

Je l'ai fait et je reçois le message d'erreur: "Chaque table dérivée doit avoir son propre alias" – Tim

+0

@Tim: édité, solution facile – Borealid

0

L'utilisation d'un sous-sélection et distincte:

select sum(valform) from (
    select distinct a.id, a.valfrom ... 
    inner join ... 
    where ... 
) 

Ou en utilisant l'option de groupe de:

select sum(valform) from (
    select a.id, min(a.valfrom) 
    inner join ... 
    where ... 
    group by a.id 
) 

Mais je pense que la première requête sera plus rapide.

+1

techniquement, en SQL standard, vous devez GROUP sur toutes les colonnes qui ne sont pas des agrégats, si la mémoire est bonne ... MySQL n'applique pas la restriction pour quelque raison que ce soit. – Borealid

+0

sans grouper par, je reçois le résultat comme vous pouvez le voir dans mon premier post. Ce n'est pas le résultat que je veux avoir. – Tim

+0

Oui, j'ai mal lu votre question d'abord, voir la nouvelle solution. –

0

Cela fera l'affaire :)

select a.id, a.valfrom, SUM(val) as mySum ... 
    inner join ... 
    where ... 
GROUP BY NULL 
+1

Et si deux ID différents avaient la même valeur? – Borealid

+0

Cela donne la même chose que l'exemple DISTINCT de Borealid, mais c'est moins clair. –

0

Si vous interrogez est

select a.id, a.valfrom ... 
    inner join ... 
    where ...; 

essayez ceci:

select sum(distinct a.valfrom) 
    inner join ... 
    where ...; 

Non "groupe par", les mains vers le bas.

-1

Vous avez juste besoin d'utiliser la distinction sur laquelle vous devez effectuer la sommation.

select ID,Sum(Distinct Val) 
from Table 
Group By ID;