Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Beto Lima

separar registros por colunas

Recommended Posts

Bom tenho a seguinte situação:

 

tabela notas

 

id | codigo | nome | nota

1 | 5 | joao | 2

2 | 5 | joao | 4

3 | 6 | jose | 1

4 | 6 | jose | 7

 

-------------------

 

Preciso fazer um select sair assim

 

id | codigo | nome | nota | coluna_temporária

1 | 5 | joao | 2 | 4

2 | 6 | jose | 1 | 7

 

 

já tenntei de tudo, case when, having, count e não deu.

Valeu pela ajuda

Compartilhar este post


Link para o post
Compartilhar em outros sites

SELECT id, codigo, nome, nota

FROM notas

group by codigo

 

deu erro.

ERRO: coluna "notas.id" deve aparecer na cláusula GROUP BY ou ser utilizada em uma função de agregação

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma solução pode ser usar uma FUNCTION para fazer (se o BD suporta isto)

 

Veja

Compartilhar este post


Link para o post
Compartilhar em outros sites

consegui da seguinte maneira, não sei se é a mais correta mas pelo menos funcionou.

se tiver algum furo digam aí.

 

 

SELECT a.id, a.codigo, a.nome, a.nota,

(

CASE (ARRAY(SELECT COUNT(n.nota) FROM notas n WHERE n.nota = a.nota))

WHEN '{1}' THEN 'DIFERENTE' ELSE 'IGUAL' END

) as "TOTAL"

FROM notas a

 

Motta, me diga uma coisa se há como fazer:

 

id | codigo | nome | nota

1 | 5 | joao | 2

2 | 5 | joao | 3

3 | 6 | jose | 2

4 | 6 | ciclano | 7

 

 

vendo assim da pra perceber que o joao empatou com o jose, as notas deles estão iguais 2.

penso o seguinte: no mesmo select criar uma coluna temporaria assim como a "TOTAL", e colocar a classificação dele ali. Mas não 1,2,3,4 . penso assim:

 

 

id | codigo | nome | nota | coluna_temporaria_classificacao

1 | 5 | joao | 2 | 3

2 | 5 | joao | 3 | 2

3 | 6 | jose | 2 | 3

4 | 6 | ciclano | 7 | 1

 

e assim iria para o próximo registro até acabar a tabela, se o cara empatou então mantém a mesma classificação, senão vai adiante.

 

Valeu

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu não entendi totalmente o problema mas a classificação poderia ser feita pela média e um order.

 

 

select id,codigo,nome,avg(nota) media
from notas
group by id,codigo,nome
order by 4 desc

Não sei se é isto.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Na verdade Motta seria ssim.

Eu dei este exemplo pra deixar bem simples mas vou ter que mostrar o real problema

Bom em primeiro lugar devo trocar a coluna id por colua cpf, onde cpf será a chave primária.

Já existe uma coluna com a classificação do vivente onde se dá por ordem 1,2,3,4....

Esta classificação é gerada por um processamento pela nota, e então é atribuida a ordem como escrevi acima 1,2,3,4....

O que eu preciso é ter um relatório preliminar, o que seria isso? seria um select pra mostrar os aprovados e empatados.

Aprovados são os que tem as maiores notas e notas distintas.

Empatados como já diz tem as notas iguais.

Hoje ele continua colocando a classificação por ordem de maior nota.

O que eu preciso é por exemplo: se o cara está em segundo lugar com uma nota X e o terceiro lugar está com a mesma nota do segundo, Então que o terceiro lugar apareça como segundo também. Porque não seria justo ele ficar em terceiro já que tem a mesma nota do segundo entende?

E seguiria na sequencia procurando pelo terceiro lugar e se o mesmo estiver sozinho então pularia para o quarto e assim por diante.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O Oracle tem funções que fazem este tipo de ranqueamento, o PostGreSQL já não sei.

 

Uma função como a que você montou (na realidade um subselect) mostra se o registro tem algum empatado com ele.

 

Mas em caso de empate não existe mais nenhuma regra para desenpatar, tipo o mais velho, a maior nota em português ou algo assim ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta existe sim, mas essa idéia é após realizado todos os tipos de desempate. e então permanecendo empates vai para sorteio publico. essa parte que estou mostrando é digamos o ultimo relatorio antes do sorteio.

Então talvez não tenha como fazer este ranqueamento!!!

valeu Motta

Compartilhar este post


Link para o post
Compartilhar em outros sites

é, vi o dense_rank mas não consegui usar ela no postgres ou não suporta.

 

SELECT id, codigo, nome, nota,

DENSE_RANK() OVER(ORDER BY nota DESC) AS classificacao

FROM notas order by nota desc

 

 

ERRO: erro de sintaxe em ou próximo a "OVER"

LINE 2: DENSE_RANK() OVER(ORDER BY nota DESC) AS classificacao

Compartilhar este post


Link para o post
Compartilhar em outros sites

É bicho, eu termino por aqui não manjo síntaxe de PostGree...

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.