Classificações em Access/SQL

Koncaman

Utilizador Saloio
Boas

Ando aqui a queimar a pestana ha umas horas valentes, com uma coisa que era basica de fazer, se fosse eu a fazer um programazito em C.

então é o seguinte, tenho aqui umas classificações de uma corrida para organizar, e preciso de classificar clubes.
o regulamento da prova diz que a classificação dos clubes, deve ser feita somand as posições dos 3 primeiros atletas de cada clube (os clubes ficam melhor posicionados quanto menor for o resultado dessa soma).

Ora bem, esquecendo o resto da base de dados, eu tenho uma tabela com 3 colunas "Posição" "Clube" e "Nome do Atleta"
(Posição, é a posição do atleta na classificação geral)

precisava simplesmente de um querry que me somasse a posição dos 3 primeiros atletas de cada clube, e me devolvesse algo simples, como uma tabela de 2 colunas, onde está o nome de cada clube, e o resultado da soma dos 3 primeiros atletas desse clube.

os clubes com menos de 3 atletas ja estão filtrados, o problema está com os clubes que têm mais que 3 atletas.
o mais proximo que consigo, é somar as posições de todos os atletas de cada clube (o que prejudica obviamente os clubes com muitos atletas... e chegam a ser mais de 20 por clube)

Eu acredito que isto seja uma cena basica de fazer... mas pronto, estou atrofiar com isto.

Acudam :D
 
Já experimentaste a TOP clause?

Por exemplo SELECT TOP 3 [coluna].... FROM [database]..WHERE [COLUNA] = valor desejado..

Suponho que q já tenhas tudo sorted..
 
ja experimentei... mas ele selecciona-me so os 3 primeiros classificados, de todos os que estão na lista, não consigo fazer com que diferencie os 3 primeiros de cada clube, sem separar todos os atletas de cada clube por uma tabela... o que não pode ser, visto que eu pretendo usar isto para os proximos anos, e no ano que vem, não posso estar a contar com os clubes que tive este ano.

entretanto, no access, pus-me a experimentar umas coisas na parte dos relatorios, e ja consigo ordenar a malta por clube, e consigo ir fazendo um carry sum, ao longo das posições de cada atleta de um clube (ou seja, ao 3º atleta do clube, tenho la o nº que me interessa).

falta-me ordenar levando em consideração o nº que está a frente do 3º atleta, e falta-me conseguir excluir os atletas que estão em 4º, 5º e restantes posições... so para simplificar um bocado a tabela. (vai ser complicado)
 
Última edição:
Então mas se tu especificares where clube = 'whatever' e usares com o Select TOP 3 [posição], ele devia retornar-te os 3 atletas de um determinado clube , ou seja, os 3 primeiros do clube...

Seja, uma coisa do género (isto é genérico com colunas tb genéricas)

SELECT TOP 3 SUM(POSICAO), [outra_coluna]
FROM [TABELA]
WHERE (CLUBE = 17)
GROUP BY [COLUNA]
 
Última edição:
Para resolveres, tens que cruzar a tabela com ela propria mais duas vezes.
Utilizando o máx. de posicao em cada cruzamento, sendo que a posicao é inferior em cada cruzamento. Isto salvarguadando os cruzamentos do nome da equipa. Depois é fazer o sum ao resultado final.
 
Pois, eu também ia sugerir o uso de uma crosstab caso não conseguisses dessa maneira. Mas a query será um pouco mais complexa..

E claro que se quiseres que seja reusável talvez devas criar uma SP em vez de submeteres só uma query contra a BD.
 
Então mas se tu especificares where clube = 'whatever' e usares com o Select TOP 3 [posição], ele devia retornar-te os 3 atletas de um determinado clube , ou seja, os 3 primeiros do clube...

Seja, uma coisa do género (isto é genérico com colunas tb genéricas)

SELECT TOP 3 SUM(POSICAO), [outra_coluna]
FROM [TABELA]
WHERE (CLUBE = 17)
GROUP BY [COLUNA]

sim, nesse caso talvez funcionasse, mas eu queria evitar a todo o custo defenir os clubes manualmente... por isso inviabiliza o processo automatico da coisa...

vou ver o que consigo fazer com a ideia do Poiel (apesar de não a ter apanhado a 100%, n estou a ver como fazer a parte do "sendo que a posicao é inferior em cada cruzamento")
 
Última edição:
1º Select Clube, Min(posicao)
From Tabela

2º Select Clube, Min(posicao)
From Tabela T, 1º
Where T.clube = 1º.clube
And T.posicao > 1.posicao

3º.......

4º Select Clube, 1º.posicao+2º.posicao+3º.posicao
From 1º, 2º, 3º
Where 1º.clube=2º.clube
And 2º.clube=3ºclube
 
obrigado ;)

deixa ver se consigo implementar isso.

Edit:

pois, parece que ha aqui um conflito, eu n lhe posso pedir o minimo, e ao mesmo tempo pedir que seja maior que o outro minimo que eu ja tinha recolhido.
se lhe pedir isso, ele n me devolve nada, porque o minimo é igual ao outro minimo que eu tinha seleccionado

Edit2:

ok, acho que ja esta contornado

Edit3:

pronto, foram precisos 6 Querrys, mas acho que o problema ja esta resolvido :D
1 querry para ver quais os melhores classificados, um 2º querry para ver os restantes melhores classificados, um 3º querry para ver qual o melhor classificado dos que restam, um 4º querry para fazer a mesma coisa que o 2º, e um 5º querry para fazer a mesma coisa que o 3º, e por fim, um 6º querry para compilar tudo, fazer o somatorio, e ordenar.

não acredito que esta seja a forma mais simples de resolver o problema... mas pronto, desenrrasca, e parece-me ser uma coisa solida.
 
Última edição:
Back
Topo