J'ai une instruction SQL comme celle-ci: En conséquence, j'ai ceci: p> afin que vous puissiez voir, un ID a une valeur. P> Si je fais un groupe par (A.Id), je reçois: p> Ce que je veux obtenir du dernier Le résultat est la somme:
10 + 21 + 2 + 30 = 63. P> Alors, comment puis-je obtenir la somme comme un résultat unique?
Si je fais une somme (A.val) et utilisez le groupe par (A.Id), je n'obtiens pas 63, je reçois la somme pour chaque identifiant, par exemple ID = 3 -> 10 + 10 + 10 = 30. p> meilleures salutations. p> p>
5 Réponses :
Vous ne voulez pas de groupe, alors. Vous ne pouvez pas également sélectionner l'identifiant correctement dans SQL standard. Vous voulez juste: p>
Mais, MySQL prend en charge quelques extensions à la syntaxe SQL standard qui pourrait faire ce travail: P>
Sélectionnez la somme (Val) à partir de (Sélectionnez une carte d'identité distincte, Val de ...) comme FOO code> p>
Sélectionnez une carte d'identité distincte, Somme (Val) de ... Code> P>
Sélectionnez à partir de Sélectionnez Equals "Boooooo". Le regroupement est la voie, mais avec quelque chose qu'ils ont tous en commun: le null code>. Voir ma réponse
J'ai fait cela et j'ai reçu le message d'erreur: "Chaque table dérivée doit avoir son propre alias"
Je l'ai résolu. Je dois utiliser comme pour la table sous-sélectionnée et comme pour "ID" et "VAL" dans le sous-sélection
logique. Je ne peux pas résumer une colonne qui n'est pas encore un numéro.
en utilisant un sous-sélection et distincts: ou à l'aide de groupe-by: p> mais je pense que la première requête sera plus rapide . p> p>
Techniquement, dans SQL standard, vous devez regrouper sur toutes les colonnes qui ne sont pas des agrégats, si la mémoire sert correctement ... MySQL ne respecte pas la restriction pour une raison quelconque.
Sans groupe par, je reçois le résultat que vous pouvez voir dans mon premier post. Ce n'est pas le résultat que je veux avoir.
@Borealid: vous êtes correct - MySQL documenté le "Caractéristique" ; IIRC, SQLite a le même groupe par la fonctionnalité que MySQL (GRRRR ...) ...
Cela fera le truc :)
Et si deux identifiants différents ont la même valeur?
Cela se traduit par la même chose que l'exemple distinct de Borealid, mais c'est moins clair.
Si vous interrogez IS
select sum(distinct a.valfrom) inner join ... where ...;
Vous devez juste utiliser le distinct sur lequel vous devez faire la somme.
Que se passe-t-il si deux identifiants différents ont la même valeur cependant, vous couriez un distinct sur Val et en perdriez l'un d'entre eux pour la somme.