sql >> Base de Datos >  >> RDS >> Oracle

Grupo de Oracle por una sola columna

Comentario largo aquí;

Sí, no puedes hacer eso. Piénsalo... Si tienes una mesa así:

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

Y estás agrupando solo por Col2 , que se agrupará en una sola fila... lo que sucede con Col1 y Col3 ? Ambos tienen 3 valores de fila distintos. ¿Cómo se supone que su DBMS los muestre?

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

Es por eso que debe agrupar por todas las columnas, o bien agregarlas o concatenarlas. (SUM() ,MAX() , MIN() , etc.)

Muéstranos cómo quieres que se vean los resultados y estoy seguro de que podemos ayudarte.

Editar - Respuesta:

En primer lugar, gracias por actualizar su pregunta. Su consulta no tiene id pero los resultados esperados sí, así que responderé por cada uno por separado.

Sin id

Aún necesitará agrupar por todas las columnas para lograr lo que está buscando. Recorrámoslo.

Si ejecuta su consulta sin ningún grupo por:

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

Obtendrás esto de vuelta:

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

Así que ahora solo quieres ver el col1 = 1 fila una vez. Pero para hacerlo, debe rodar todos de las columnas hacia arriba, para que su DBMS sepa qué hacer con cada una de ellas. Si intenta agrupar solo por col1 , su DBMS tendrá un error porque no le dijo qué hacer con los datos adicionales en col2 y 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 agrupa por los 3, su DBMS sabe agrupar las filas completas (que es lo que desea), y solo mostrará las filas duplicadas una vez:

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

Con id

Si quieres ver id , tendrá que decirle a su DBMS qué id para mostrar Incluso si agrupamos por todas las columnas, no obtendrá los resultados deseados, porque el id columna hará que cada fila sea distinta (ya no se agruparán):

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

Entonces, para agrupar estas filas, debemos decir explícitamente qué hacer con el id s. En función de los resultados deseados, desea elegir id = 2 , que es el mínimo id , así que usemos 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

Que devuelve los resultados deseados (con id ):

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

Pensamiento final

Aquí estaban sus dos filas de problemas:

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

Cada vez que los presione, solo piense en lo que quiere que haga cada columna, una a la vez. Deberá manejar todos columnas cada vez que realice agrupaciones o agregados.

  • id , solo desea ver id = 2 , que es el MIN()
  • co1 , solo desea ver valores distintos, por lo que GROUP BY
  • col2 , solo desea ver valores distintos, por lo que GROUP BY
  • col3 , solo desea ver valores distintos, por lo que GROUP BY