none
Dúvida ORDER BY com UNION RRS feed

  • Pergunta

  • Pessoal,

    Preciso fazer um union com as query's abaixo, e ordenar o seu resultado, porém está dando erro na linha do order by:

    ORDER BY items must appear in the select list if the statement contains a UNION operator. Severity 15

    Segue a query

    SELECT TOP 3 nome_produto, sum(Quantidade) AS Quantidade
    FROM ##tmp_ProdutosUtilizados
    WHERE Meta = 3 AND quantidadeAtendimento = 2
    GROUP BY nome_produto

    UNION


    SELECT [nome_produto], SUM(Quantidade)  FROM
    (

    SELECT 'Outros' AS [nome_produto] , sum(tmp.Quantidade) AS Quantidade
    FROM ##tmp_ProdutosUtilizados tmp
    WHERE tmp.Meta = 3 AND tmp.quantidadeAtendimento = 2
    AND nome_produto NOT IN(SELECT TOP 3 nome_produto FROM ##tmp_ProdutosUtilizados t
    WHERE t.Meta = 3 AND t.quantidadeAtendimento = 2 GROUP BY [nome_produto] ORDER BY sum(Quantidade) DESC)
    GROUP BY [nome_produto]

    )t
    GROUP BY [nome_produto]
    ORDER BY sum(Quantidade) DESC

    quinta-feira, 21 de novembro de 2013 18:37

Respostas

Todas as Respostas

  • Deleted
    quinta-feira, 21 de novembro de 2013 18:49
  • Deleted
    quinta-feira, 21 de novembro de 2013 18:59
  • Na verdade a ideia é pegar as 3 linhas com as maiores somas, e o restante dos registros, classifica-los com o nome 'Outros' e realizar o restante da soma na segunda consulta eu preciso trazer tudo que não veio antes do UNION.

    Do jeito que você passou não funcionou, continuou com o mesmo erro, porém dessa maneira funcionou:

    SELECT * FROM (
    
    SELECT TOP 3 nome_produto, sum(Quantidade) AS Quantidade
    FROM ##tmp_ProdutosUtilizadosWHERE Meta = 3 
    AND quantidadeAtendimento = 2GROUP BY nome produto
    ORDER BY sum(Quantidade) DESC
    
    UNION
    
    SELECT [nome_produto], SUM(Quantidade)  
    FROM
    (SELECT 'Outros' AS [nome_produto] , sum(tmp.Quantidade) AS Quantidade
    FROM ##tmp_ProdutosUtilizados tmp
    WHERE tmp.Meta = 3 AND tmp.quantidadeAtendimento = 2
    AND nome_produto 
    NOT IN(SELECT TOP 3 nome_produto 
    FROM ##tmp_ProdutosUtilizados t
    WHERE t.Meta = 3 AND t.quantidadeAtendimento = 2 
    GROUP BY [nome_produto] 
    ORDER BY sum(Quantidade) DESC)
    GROUP BY [nome_produto])t
    GROUP BY [nome_produto])a
    ORDER BY Quantidade DESC

    quinta-feira, 21 de novembro de 2013 19:12
  • Deleted
    • Marcado como Resposta Guilherme da Luz quinta-feira, 21 de novembro de 2013 20:10
    quinta-feira, 21 de novembro de 2013 19:28
  • José,

    Aqui é SQL 2000, não vai funcionar o WITH.

    Verdade, acabei de fazer um outro teste e o Outros não veio em último, mas do jeito que eu estou fazendo há como ele vir sempre a última linha?

    Deixa eu aproveitar e perguntar outra coisa, antes de usar o NOT IN, eu estava tentando usar o NOT EXISTS, porém a consulta não retornava o resultado correto, dá pra utilizar o NOT EXISTS nesse caso?


    quinta-feira, 21 de novembro de 2013 19:49
  • Deleted
    • Marcado como Resposta Guilherme da Luz quinta-feira, 21 de novembro de 2013 20:10
    quinta-feira, 21 de novembro de 2013 19:58
  • Tem a questão do row_number também né......não tem no 2000.....mas vou procurar algo equivalente e fazer desse jeito que você postou.

    Valeu pela ajuda.


    quinta-feira, 21 de novembro de 2013 20:06
  • Deleted
    quinta-feira, 21 de novembro de 2013 20:21
  • Deleted
    • Marcado como Resposta Guilherme da Luz sexta-feira, 22 de novembro de 2013 12:44
    quinta-feira, 21 de novembro de 2013 20:23
  • Deleted
    • Marcado como Resposta Guilherme da Luz sexta-feira, 22 de novembro de 2013 12:44
    quinta-feira, 21 de novembro de 2013 22:25
  • -- código 3a
    --if OBJECT_ID('tempdb..#X2') >0 drop table #X2;
    
    SELECT IDENTITY(INT, 1,1) as Seq, Nome_Produto, Quantidade
      into #X2 
      from (SELECT Nome_Produto, sum(Quantidade) as Quantidade
              from ##tmp_ProdutosUtilizados
              where Meta = 3 and quantidadeAtendimento = 2
              group by Nome_Produto) as X1
      order by X1.Quantidade desc;
    
    SELECT Seq, Nome_Produto, Quantidade
      from #X2
      where Seq <= 3
    union
    SELECT 4, 'outros', sum(Quantidade)
      from #X2
      where Seq > 3
    order by Seq;
    
    drop table #X2;

    Guilherme,  a linha inicial, que verifica se existe #X2, não sei o código está correto para a versão 2000.

    É necessário decidir o que fazer se houver empate nas posições iniciais. Por exemplo, se as posições 3 e 4 tiverem a mesma somatória de quantidade, o que fazer? Simula-se rank() ou dense_rank()?


        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)


    José,

    Funcionou perfeitamente, muito obrigado.

    Acho que no caso precisaria do dense_rank.

    sexta-feira, 22 de novembro de 2013 12:44