Oracle
 sql >> Base de données >  >> RDS >> Oracle

Groupe Oracle par une seule colonne

Commentaire long ici ;

Ouais, tu ne peux pas faire ça. Pensez-y... Si vous avez un tableau comme celui-ci :

Col1 Col2 Col3
A    A    1
B    A    2
C    A    3

Et vous regroupez uniquement par Col2 , qui se regroupera en une seule ligne... qu'advient-il de Col1 et Col3 ? Les deux ont 3 valeurs de ligne distinctes. Comment votre SGBD est-il censé les afficher ?

Col1 Col2 Col3
A?   A    1?
B?        2?
C?        3?

C'est pourquoi vous devez regrouper toutes les colonnes, ou les agréger ou les concaténer. (SUM() ,MAX() , MIN() , etc.)

Montrez-nous à quoi vous voulez que les résultats ressemblent et je suis sûr que nous pourrons vous aider.

Modifier - Réponse :

Tout d'abord, merci d'avoir mis à jour votre question. Votre requête n'a pas d'id mais vos résultats attendus le font, donc je vais répondre pour chacun séparément.

Sans id

Vous devrez toujours regrouper toutes les colonnes pour obtenir ce que vous recherchez. Parcourons-le.

Si vous exécutez votre requête sans grouper par :

select col1, col2, col3 from table where col3='200'

Vous récupérerez ceci :

+----------+-------------+-------+
| col1     | col2        | col3  |
+----------+-------------+-------+
| 1        | some text 1 | 200   |
| 2        | some text 1 | 200   |
| 5        | some text 1 | 200   |
| 1        | some text 1 | 200   |
+----------+-------------+-------+

Alors maintenant, vous voulez seulement voir le col1 = 1 ramer une fois. Mais pour ce faire, vous devez rouler tous des colonnes vers le haut, afin que votre SGBD sache quoi faire avec chacune d'elles. Si vous essayez de regrouper uniquement par col1 , votre SGBD passera par une erreur parce que vous ne lui avez pas dit quoi faire avec les données supplémentaires dans col2 et col3 :

select col1, col2, col3 from table where col3='200' group by col1 --Errors

+----------+-------------+-------+
| col1     | col2        | col3  |
+----------+-------------+-------+
| 1        | some text 1 | 200   |
| 2        | some text 1 | 200   |
| 5        | some text 1 | 200   |
| ?        | some text 1?| 200?  |
+----------+-------------+-------+

Si vous regroupez par les 3, votre SGBD sait regrouper les lignes entières (c'est ce que vous voulez), et n'affichera les lignes en double qu'une seule fois :

select col1, col2, col3 from table where col3='200' group by col1, col2, col3

+----------+-------------+-------+
| col1     | col2        | col3  |
+----------+-------------+-------+
| 1        | some text 1 | 200   |
| 2        | some text 1 | 200   | --Desired results
| 5        | some text 1 | 200   |
+----------+-------------+-------+

Avec id

Si vous voulez voir id , vous devrez indiquer à votre SGBD quel id afficher. Même si nous regroupons toutes les colonnes, vous n'obtiendrez pas les résultats souhaités, car le id colonne rendra chaque ligne distincte (Elles ne seront plus regroupées) :

select id, col1, col2, col3 from table where col3='200' group by id, col1, col2, col3

+--------+----------+-------------+-------+
| id     | col1     | col2        | col3  |
+--------+----------+-------------+-------+
| 2      | 1        | some text 1 | 200   | --id = 2
| 3      | 2        | some text 1 | 200   |
| 7      | 5        | some text 1 | 200   |
| 8      | 1        | some text 1 | 200   | --id = 8
+--------+----------+-------------+-------+

Donc, pour regrouper ces lignes, nous devons dire explicitement quoi faire avec le id s. En fonction des résultats souhaités, vous souhaitez choisir id = 2 , qui est le minimum id , alors utilisons MIN() :

select MIN(id), col1, col2, col3 from table where col3='200' group by col1, col2, col3
--Note, MIN() is an aggregate function, so id need not be in the group by

Qui renvoie les résultats souhaités (avec id ):

+--------+----------+-------------+-------+
| id     | col1     | col2        | col3  |
+--------+----------+-------------+-------+
| 2      | 1        | some text 1 | 200   |
| 3      | 2        | some text 1 | 200   |
| 7      | 5        | some text 1 | 200   |
+--------+----------+-------------+-------+

Réflexion finale

Voici vos deux lignes de problèmes :

+--------+----------+-------------+-------+
| id     | col1     | col2        | col3  |
+--------+----------+-------------+-------+
| 2      | 1        | some text 1 | 200   |
| 8      | 1        | some text 1 | 200   |
+--------+----------+-------------+-------+

Chaque fois que vous les touchez, pensez simplement à ce que vous voulez que chaque colonne fasse, une à la fois. Vous devrez gérer tous colonnes chaque fois que vous effectuez des regroupements ou des agrégats.

  • id , vous ne voulez voir que id = 2 , qui est le MIN()
  • co1 , vous ne voulez voir que des valeurs distinctes, donc GROUP BY
  • col2 , vous ne voulez voir que des valeurs distinctes, donc GROUP BY
  • col3 , vous ne voulez voir que des valeurs distinctes, donc GROUP BY