none
Sistema de ranking RRS feed

  • Pergunta

  • Olá,

    Preciso de ajuda com uma query para fazer um sistema de ranking.

    É o seguinte tenho estas tabelas:

    Local de Compra: idLocalCompra | LocalCompra

    UtilizadorCompras: idUtilizar | idLocalCompra | ...

    Como posso fazer? eu acho que é fazer o count com o distinct retornando o idLocalCompra:

    retorno (exemplo):

    idLocalCompra | Count

               3           | 10

               1           |  7

               2           |  3

    Irei precisar desta query não só para este caso, mas também para outros.

    Se alguém puder dar uma força agradeço.

    Cumpz, ADAE.

    sexta-feira, 14 de junho de 2013 16:28

Respostas

  • Cometi o mesmo erro nas duas querys... esqueci de adicionar a clausula Group By:

    select 
        l.idLocalCompra,
        l.LocalCompra,
        count(*) as Qtd
    from Localcompra as l
    inner joing UtilizadorCompras as u
        on u.idLocalCompra = l.idLocalCompra
    group by
        l.idLocalCompra,
        l.LocalCompra
    order by Qtd desc

    select 
        idLocalCompra,
        count(*) as Qtd
    from UtilizadorCompras
    group by
        idLocalCompra
    order by Qtd desc

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta AD_AE sexta-feira, 14 de junho de 2013 17:19
    sexta-feira, 14 de junho de 2013 17:17
  • Deleted
    • Marcado como Resposta AD_AE sábado, 15 de junho de 2013 22:07
    sábado, 15 de junho de 2013 22:01

Todas as Respostas

  • Boa tarde,

    Experimente mais ou menos dessa forma:

    select 
        l.idLocalCompra,
        l.LocalCompra,
        count(*) as Qtd
    from Localcompra as l
    inner joing UtilizadorCompras as u
        on u.idLocalCompra = l.idLocalCompra
    order by Qtd desc

    Ou se forem necessárias somente as duas colunas do seu exemplo e não houverem outras condições:

    select 
        idLocalCompra,
        count(*) as Qtd
    from UtilizadorCompras
    order by Qtd desc

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br


    • Editado gapimex sexta-feira, 14 de junho de 2013 16:49 sugestão adicional
    sexta-feira, 14 de junho de 2013 16:46
  • Olá,

    Quanto tento a primeira query

    SELECT l.CodLocalCompra, l.LocalCompra, COUNT(*) AS Qtd
    FROM Localcompra AS l inner join Colecionador_Disco AS u ON u.CodLocalCompra = l.CodLocalCompra 
    ORDER BY Qtd DESC

    é retornado este erro:

    Column 'Localcompra.CodLocalCompra' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

    #EDIT: A segunda query retorna o mesmo erro.

    Cumpz, ADAE.

    • Editado AD_AE sexta-feira, 14 de junho de 2013 17:13
    sexta-feira, 14 de junho de 2013 17:12
  • Cometi o mesmo erro nas duas querys... esqueci de adicionar a clausula Group By:

    select 
        l.idLocalCompra,
        l.LocalCompra,
        count(*) as Qtd
    from Localcompra as l
    inner joing UtilizadorCompras as u
        on u.idLocalCompra = l.idLocalCompra
    group by
        l.idLocalCompra,
        l.LocalCompra
    order by Qtd desc

    select 
        idLocalCompra,
        count(*) as Qtd
    from UtilizadorCompras
    group by
        idLocalCompra
    order by Qtd desc

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta AD_AE sexta-feira, 14 de junho de 2013 17:19
    sexta-feira, 14 de junho de 2013 17:17
  • Hehe

    tinha acabado de conseguir da mesma forma que vc postou:

    SELECT lc.CodLocalCompra, lc.LocalCompra, COUNT(*) AS Qtd
    FROM Localcompra AS lc inner join Colecionador_Disco AS cd ON cd.CodLocalCompra = lc.CodLocalCompra 
    GROUP BY lc.CodLocalCompra, lc.LocalCompra
    ORDER BY Qtd DESC

    Obrigado.

    Cumpz, ADAE.

    sexta-feira, 14 de junho de 2013 17:19
  • Deleted
    sábado, 15 de junho de 2013 09:55
  • No SQL Server há algumas funções de ranqueamento que podem ser úteis nesse caso. Em específico duas delas:

    RANK  e

    DENSE_RANK.

       
    Segue código usando uma das funções:

    select dense_rank() over (order by Qtd desc) as [Posição], LC.LocalCompra
      from (select idLocalCompra, count(*) as Qtd 
              from UtilizadorCompras 
              group by idLocalCompra) as UC
           inner join [Local de Compra] as LC on LC.idLocalCompra=UC.idLocalCompra
      order by Posição, LC.LocalCompra;


    Belo Horizonte, MG - Brasil

    Olá,

    Sua query não funciona corretamente, mas obrigado à mesma.

    Ela está retornando a posição sempre com 1, e mostrando os locais pelo ordem de inserção.

    Cumpz, ADAE.

    sábado, 15 de junho de 2013 17:52
  • Deleted
    • Marcado como Resposta AD_AE sábado, 15 de junho de 2013 22:07
    sábado, 15 de junho de 2013 22:01
  • Oá,

    Funcionou corretamente.

    Se não for pedir muito, e caso vc saiba, poderia me ajudar a converter essa sua query para LINQ?

    Cumpz, ADAE.

    sábado, 15 de junho de 2013 22:08
  • Deleted
    sábado, 15 de junho de 2013 22:15