Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Grupo Oracle por apenas UMA coluna


Comentário longo aqui;

Sim, você não pode fazer isso. Pense nisso... Se você tem uma tabela assim:
Col1 Col2 Col3
A    A    1
B    A    2
C    A    3

E você está agrupando apenas por Col2 , que agrupará em uma única linha... o que acontece com Col1 e Col3 ? Ambos têm 3 valores de linha distintos. Como seu DBMS deve exibi-los?
Col1 Col2 Col3
A?   A    1?
B?        2?
C?        3?

É por isso que você precisa agrupar por todas as colunas ou agregá-las ou concatená-las. (SUM() ,MAX() , MIN() , etc.)

Mostre-nos como você deseja que os resultados sejam e tenho certeza de que podemos ajudá-lo.

Editar - Resposta:

Primeiramente, obrigado por atualizar sua pergunta. Sua consulta não tem id mas seus resultados esperados sim, então responderei por cada um separadamente.

Sem id

Você ainda precisará agrupar por todas as colunas para alcançar o que deseja. Vamos percorrê-lo.

Se você executar sua consulta sem nenhum grupo por:
select col1, col2, col3 from table where col3='200'

Você receberá isso de volta:
+----------+-------------+-------+
| col1     | col2        | col3  |
+----------+-------------+-------+
| 1        | some text 1 | 200   |
| 2        | some text 1 | 200   |
| 5        | some text 1 | 200   |
| 1        | some text 1 | 200   |
+----------+-------------+-------+

Então agora você quer ver apenas o col1 = 1 remar uma vez. Mas para fazer isso, você precisa rolar todos das colunas para cima, para que seu SGBD saiba o que fazer com cada uma delas. Se você tentar agrupar apenas por col1 , seu DBMS passará por um erro porque você não disse o que fazer com os dados extras em col2 e 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?  |
+----------+-------------+-------+

Se você agrupar por todos os 3, seu DBMS saberá agrupar as linhas inteiras (que é o que você deseja) e exibirá as linhas duplicadas apenas uma 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   |
+----------+-------------+-------+

Com id

Se você quiser ver id , você terá que informar ao seu DBMS qual id mostrar. Mesmo se agruparmos por todas as colunas, você não obterá os resultados desejados, porque o id coluna tornará cada linha distinta (eles não serão mais agrupados):
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
+--------+----------+-------------+-------+

Portanto, para agrupar essas linhas, precisamos dizer explicitamente o que fazer com o id s. Com base nos resultados desejados, você deseja escolher id = 2 , que é o mínimo id , então vamos usar 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 retorna os resultados desejados (com id ):
+--------+----------+-------------+-------+
| id     | col1     | col2        | col3  |
+--------+----------+-------------+-------+
| 2      | 1        | some text 1 | 200   |
| 3      | 2        | some text 1 | 200   |
| 7      | 5        | some text 1 | 200   |
+--------+----------+-------------+-------+

Pensamento final

Aqui estavam suas duas linhas de problemas:
+--------+----------+-------------+-------+
| id     | col1     | col2        | col3  |
+--------+----------+-------------+-------+
| 2      | 1        | some text 1 | 200   |
| 8      | 1        | some text 1 | 200   |
+--------+----------+-------------+-------+

Sempre que você acertar isso, pense no que deseja que cada coluna faça, uma de cada vez. Você precisará lidar com todos colunas sempre que você fizer agrupamentos ou agregações.
  • id , você só quer ver id = 2 , que é o MIN()
  • co1 , você só quer ver valores distintos, então GROUP BY
  • col2 , você só quer ver valores distintos, então GROUP BY
  • col3 , você só quer ver valores distintos, então GROUP BY