Usuário com melhor resposta
Dúvida ORDER BY com UNION

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_produtoUNION
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
Respostas
-
Deleted
- Marcado como Resposta Guilherme da Luz quinta-feira, 21 de novembro de 2013 20:10
-
Deleted
- Marcado como Resposta Guilherme da Luz quinta-feira, 21 de novembro de 2013 20:10
-
Deleted
- Marcado como Resposta Guilherme da Luz sexta-feira, 22 de novembro de 2013 12:44
-
Deleted
- Marcado como Resposta Guilherme da Luz sexta-feira, 22 de novembro de 2013 12:44
Todas as Respostas
-
-
-
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
-
Deleted
- Marcado como Resposta Guilherme da Luz quinta-feira, 21 de novembro de 2013 20:10
-
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?
- Editado Guilherme da Luz quinta-feira, 21 de novembro de 2013 19:55
-
Deleted
- Marcado como Resposta Guilherme da Luz quinta-feira, 21 de novembro de 2013 20:10
-
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.
- Editado Guilherme da Luz quinta-feira, 21 de novembro de 2013 20:15
-
-
Deleted
- Marcado como Resposta Guilherme da Luz sexta-feira, 22 de novembro de 2013 12:44
-
Deleted
- Marcado como Resposta Guilherme da Luz sexta-feira, 22 de novembro de 2013 12:44
-
-- 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.