2010-05-07 8 views
1

Je travaille sur un papier d'examen simulé pour le moment, mais je n'ai aucun ensemble de bonnes réponses et je ne suis pas sûr de savoir quelle est la bonne réponse à cette requête SQL.Quel est le résultat de cette requête SQL?

donné une table:

foo, bar 
a , 1 
b , 3 
a , 2 
c , 1 

et la requête:

SELECT foo, sum(bar) 
FROM table 
GROUP BY foo 

Les deux façons je peux voir ce que cela va sont soit:

a 3 
a 3 
b 3 
c 1 

ou

a 3 
b 3 
c 1 

Merci.

Répondre

3

GROUP BY combine toutes les lignes ayant les mêmes noms de valeur dans GROUP BY. La SUM indique à la requête ce qu'il faut faire avec les valeurs non nommées dans GROUP BY.

foo, bar 
a , 1 
b , 3 
a , 2 
c , 1 

SELECT foo, sum(bar) 
FROM table 
GROUP BY foo 

et vous obtiendrez 1 ligne pour chaque foo: a, b et c, et il résumera les valeurs de barre pour chacun de ces groupes: un (1 + 2), b (1), c (1)

et le résultat dans votre deuxième jeu de résultats:

a 3 
b 3 
c 1 

Puisque c'est des devoirs, vous devez apprendre:

dE et REJOIGNEZ déterminer & rangées de filtres
plusieurs filtres sur les lignes
GROUP BY combine les lignes en groupes
AYANT groupes de filtres
ORDER BY arrange les lignes/groupes restants

6

Ce sera le dernier.

GROUP BY entraînera l'ensemble de regrouper les valeurs de foo - une seule ligne pour chaque. La fonction d'agrégat SUM additionne les valeurs des colonnes bar.

+0

SQL est assez intelligent pour ne pas réduire les résultats ensemble alors? Comme dans le cas où la somme était différente pour différents a, ils ne seraient pas fusionnés d'une manière ou d'une autre – Martin

+0

@Martin - La somme de toutes les valeurs 'bar' associées à' a' sera toujours la même. Le fait qu'il y ait d'autres lignes entre les lignes 'a' n'est pas important. – Oded

+0

@martin cela ne peut pas arriver car il n'y aura qu'une seule somme pour a. Tous les 'a auront leur valeur de barre additionnée donnant un résultat pour le groupe' a '. Ce qui n'est pas une ligne 'a' particulière –

2

Celui-ci:

SELECT foo, sum(bar) 
FROM table 
GROUP BY 
     foo 

donnera:

a 3 
b 3 
c 1 

Celui-ci:

SELECT foo, SUM(bar) OVER (PARTITION BY foo) 
FROM table 

donnera:

a 3 
a 3 
b 3 
c 1 
2

la group by prendra effet en premier donc le "calcul" ira comme ça

premier groupe toutes les lignes sur la valeur de foo. vous donnant

  • groupe1: a, 1 a, 2
  • group2: b, 3
  • group3: c, 1

donc de produire une ligne de résultat pour chaque groupe sur la base du somme de la fonction agrégée. Qui est la sommation de la valeur de la barre pour chaque groupe-à-dire

  • a, 3
  • b, 3
  • c, 1
1

la requête:

select foo, sum(bar) 
from table 
group by foo 

donnera vous le deuxième ensemble de sortie:

a 3 
b 3 
c 1 

mais pas nécessairement dans cet ordre. Il peut également vous donner ces trois lignes dans n'importe quel ordre. Une clause group by n'impose pas l'ordre dans lequel les lignes sont renvoyées.

+0

FWIW, 'GROUP BY' commande l'ordre dans 'MySQL', sauf s'il est ajouté avec' ORDER BY NULL'. – Quassnoi

+1

Je préfère coder à la norme, sauf si absolument nécessaire. Je n'aime pas m'appuyer sur le comportement d'un SGBD pour ensuite découvrir qu'il se casse quand je veux bouger - c'est ainsi que les vendeurs obtiennent leur verrouillage. – paxdiablo

Questions connexes