none
Ordenar por quantidade de cidades RRS feed

  • Pergunta

  • Pessoal, tenho uma tabela produtos, estados e cidades, faço um select que me traz todos os estados e cidades q tem em produtos, ex:

    GO - cidade 1
    GO - cidade 2
    GO - cidade 3

    SP - cidade 1
    SP - cidade 2
    SP - cidade 3
    SP - cidade 4
    SP - cidade 5

    MG - cidade 1
    MG - cidade 2

    Gostaria que viesse ordenado pelo estado que tem mais cidades, no caso acima, primeiro SP, depois GO depois MG, como fazer essa ordenação?

    Obrigado!

    quarta-feira, 19 de novembro de 2014 09:11

Respostas

Todas as Respostas

  • Hello;

    You can use clause over(partition)

    select estado,cidade, count(*) over (partition by estado) as orden
    from Table
    order by orden DESC

    Best Regards

    Claudio

    • Sugerido como Resposta JM Claudio quarta-feira, 19 de novembro de 2014 09:40
    quarta-feira, 19 de novembro de 2014 09:40
  • Deleted
    quarta-feira, 19 de novembro de 2014 09:43
  • Para sugestões eficientes é necessário conhecer a estrutura das tabelas envolvidas e o código da consulta.

    Somente como demonstração, uma forma de obter o que necessita é

    -- código 1
    ;with Consulta1 as ( código da consulta original ), Consulta2 as ( SELECT *, Qtd= count(*) over (partition by UF) from Consulta2 ) SELECT UF, Cidade from Consulta2 order by Qtd desc, UF;


        José Diz     Belo Horizonte, MG - Brasil
    (Se encontrou a solução nesta resposta, ou se o conteúdo foi útil, lembre-se de marcá-la)


    Olá José, vamos lá

    tenho a tabela produtos:

    CODIGO, NOMEPRODUTO, DATAPRODUTO, CIDADE, UF

    Preciso que retorne a lista de (cidade e estado) não repetindo a cidade, e por ordem do estado que tenha mais cidades, ao utilizar essa consulta, traz o resultado só que não ordenado do jeito que preciso:

    	SELECT distinct(cidade) as cidade, uf 
    	FROM PRODUTOS
    	WHERE  ATIVO = 1 
    	AND (Convert(char, GetDate(), 102) <= Convert(char, DATAPRODUTO, 102)) 
    	ORDER BY uf ASC
    

    se eu colocar essa consulta no exemplo que me passou da erro

    A expressão da tabela comum recursiva 'Consulta2' não contém um operador UNION ALL de nível superior.

    Obrigado novamente!

    quarta-feira, 19 de novembro de 2014 18:34
  • Deleted
    • Marcado como Resposta DarkDucke quarta-feira, 19 de novembro de 2014 20:21
    quarta-feira, 19 de novembro de 2014 18:40
  • Ops! Havia um erro na CTE Consulta2, já corrigido no código 1.

    Onde estava
        from Consulta2
    foi corrigido para
       from Consulta1

     

    -- código 2 v2
    ;with
    Consulta1 as (
    SELECT distinct cidade, uf 
      FROM PRODUTOS
      WHERE ATIVO = 1 
            AND (Convert(char(10), GetDate(), 102) <= Convert(char(10), DATAPRODUTO, 102)) 
    ),
    Consulta2 as (
    SELECT *, 
           Qtd= count(*) over (partition by uf)
      from Consulta1
    )
    SELECT uf, cidade
      from Consulta2
      order by Qtd desc, uf, cidade;
      

    Como está declarada a coluna DATAPRODUTO? A conversão de DATAPRODUTO para char, na cláusula WHERE, deixa a consulta ineficiente, caso exista índice pela coluna DATAPRODUTO.


        José Diz     Belo Horizonte, MG - Brasil



    Agora deu certo, muito obrigado, e a coluna DATAPRODUTO e do tipo DATETIME, qual seria o melhor jeito de fazer a consulta?

    Obrigado novamente!

    quarta-feira, 19 de novembro de 2014 20:21
  • Deleted
    quarta-feira, 19 de novembro de 2014 20:22
  • Deleted
    quarta-feira, 19 de novembro de 2014 20:28