1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Classificações em Access/SQL

Discussão em 'Programação' iniciada por Koncaman, 13 de Setembro de 2007. (Respostas: 8; Visualizações: 1113)

  1. Koncaman

    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
     
  2. Já experimentaste a TOP clause?

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

    Suponho que q já tenhas tudo sorted..
     
  3. Koncaman

    Koncaman Utilizador Saloio

    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: 14 de Setembro de 2007
  4. 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: 14 de Setembro de 2007
  5. Poiel

    Poiel Power Member

    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.
     
  6. 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.
     
  7. Koncaman

    Koncaman Utilizador Saloio

    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: 14 de Setembro de 2007
  8. Poiel

    Poiel Power Member

    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
     
  9. Koncaman

    Koncaman Utilizador Saloio

    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: 14 de Setembro de 2007

Partilhar esta Página