7
votes

Groupe par / distinct combiné à la somme?

J'ai une instruction SQL comme celle-ci: xxx

En conséquence, j'ai ceci: xxx

afin que vous puissiez voir, un ID a une valeur.

Si je fais un groupe par (A.Id), je reçois: xxx

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

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.

meilleures salutations.


0 commentaires

5 Réponses :


15
votes

Vous ne voulez pas de groupe, alors. Vous ne pouvez pas également sélectionner l'identifiant correctement dans SQL standard. Vous voulez juste:

Sélectionnez la somme (Val) à partir de (Sélectionnez une carte d'identité distincte, Val de ...) comme FOO

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

Sélectionnez une carte d'identité distincte, Somme (Val) de ...


4 commentaires

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 . 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.



1
votes

en utilisant un sous-sélection et distincts: xxx

ou à l'aide de groupe-by: xxx

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


3 commentaires

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 ...) ...



-1
votes

Cela fera le truc :) xxx


2 commentaires

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.



2
votes

Si vous interrogez IS

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


0 commentaires

0
votes

Vous devez juste utiliser le distinct sur lequel vous devez faire la somme. XXX


1 commentaires

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.