Order BY em Select com Union
Quero fazer uma consulta que apresente os maiores compradores. A SQL abaixo funciona certinho. Porém, quero que seja listado na ordem inversa, iniciando do maior TOTAL_VENDIDO e terminado no menor. Ao listar normal (iniciando no menor, funciona direitinho), mas se eu acrescentar um ´DESC´ no ORDER BY, não faz efeito.
Por gentileza, analise o SQL e me ajude com alguma dica.
SELECT CLIENTES.CODIGO, CLIENTES.NOME AS NOME_CLIENTE,
CAST(SUM(VENDAMESTRE.TOTALVENDA) AS FLOAT) AS TOTAL_VENDIDO FROM VENDAMESTRE INNER JOIN CLIENTES ON (VENDAMESTRE.CLIENTE=CLIENTES.CODIGO)
GROUP BY 1, 2
UNION ALL
SELECT CLIENTES.CODIGO, CLIENTES.NOME AS NOME_CLIENTE,
CAST(SUM(SERVICOMESTRE.TOTALFINAL) AS FLOAT) AS TOTAL_VENDIDO FROM SERVICOMESTRE INNER JOIN CLIENTES ON (SERVICOMESTRE.CLIENTE=CLIENTES.CODIGO)
GROUP BY 1, 2
ORDER BY 3 //tanto faz qual dessas duas linhas eu
ORDER BY 3 DESC //colocar no SQL. Ambas darão a mesma ordem.
Obrigado.
Por gentileza, analise o SQL e me ajude com alguma dica.
SELECT CLIENTES.CODIGO, CLIENTES.NOME AS NOME_CLIENTE,
CAST(SUM(VENDAMESTRE.TOTALVENDA) AS FLOAT) AS TOTAL_VENDIDO FROM VENDAMESTRE INNER JOIN CLIENTES ON (VENDAMESTRE.CLIENTE=CLIENTES.CODIGO)
GROUP BY 1, 2
UNION ALL
SELECT CLIENTES.CODIGO, CLIENTES.NOME AS NOME_CLIENTE,
CAST(SUM(SERVICOMESTRE.TOTALFINAL) AS FLOAT) AS TOTAL_VENDIDO FROM SERVICOMESTRE INNER JOIN CLIENTES ON (SERVICOMESTRE.CLIENTE=CLIENTES.CODIGO)
GROUP BY 1, 2
ORDER BY 3 //tanto faz qual dessas duas linhas eu
ORDER BY 3 DESC //colocar no SQL. Ambas darão a mesma ordem.
Obrigado.
Armindo
Curtidas 0
Respostas
Emerson Nascimento
11/11/2008
tente assim:
OU
SELECT CLIENTES.CODIGO, CLIENTES.NOME AS NOME_CLIENTE, (SELECT CAST(COALESCE(SUM(VENDAMESTRE.TOTALVENDA),0) AS FLOAT) FROM VENDAMESTRE WHERE VENDAMESTRE.CLIENTE=CLIENTES.CODIGO) + (SELECT CAST(COALESCE(SUM(SERVICOMESTRE.TOTALFINAL),0) AS FLOAT) FROM SERVICOMESTRE WHERE SERVICOMESTRE.CLIENTE=CLIENTES.CODIGO) AS TOTAL_VENDIDO FROM CLIENTES ORDER BY 3
ORDER BY 3 DESC
GOSTEI 0
Armindo
11/11/2008
Obrigdo Emerson,
Com essa sua instrução funciona se mudar ´ORDER BY 3´ para ´ORDER BY TOTAL_VENDIDO´, mas a consulta fica leeeeeeeeenta, super lenta. Acho que é por causa dos subSelects.
Será que não existe uma forma de utilizar o Join?
Obrigado.
Com essa sua instrução funciona se mudar ´ORDER BY 3´ para ´ORDER BY TOTAL_VENDIDO´, mas a consulta fica leeeeeeeeenta, super lenta. Acho que é por causa dos subSelects.
Será que não existe uma forma de utilizar o Join?
Obrigado.
tente assim:
OU
SELECT CLIENTES.CODIGO, CLIENTES.NOME AS NOME_CLIENTE, (SELECT CAST(COALESCE(SUM(VENDAMESTRE.TOTALVENDA),0) AS FLOAT) FROM VENDAMESTRE WHERE VENDAMESTRE.CLIENTE=CLIENTES.CODIGO) + (SELECT CAST(COALESCE(SUM(SERVICOMESTRE.TOTALFINAL),0) AS FLOAT) FROM SERVICOMESTRE WHERE SERVICOMESTRE.CLIENTE=CLIENTES.CODIGO) AS TOTAL_VENDIDO FROM CLIENTES ORDER BY 3
ORDER BY 3 DESC
GOSTEI 0
Emerson Nascimento
11/11/2008
nas tabelas SERVICOMESTRE e VENDAMESTRE há índice para o campo CLIENTE ? se não houver, crie os índices, depois execute a instrução e veja se houve algum ganho de performance.
GOSTEI 0
Armindo
11/11/2008
nas tabelas SERVICOMESTRE e VENDAMESTRE há índice para o campo CLIENTE ? se não houver, crie os índices, depois execute a instrução e veja se houve algum ganho de performance.
Realmente, criando um índice secundário, a demora diminui sensivelmente.
Só que agora surgiu outro problema: a instrução traz todos os clientes, quando deveria listaar apenas aqueles que têm vendas.
obrigado.
GOSTEI 0
Webjoel
11/11/2008
Olá, tente o seguinte:
SELECT CODIGO, NOME_CLIENTE, TOTAL_VENDIDO, FROM ( SELECT CLIENTES.CODIGO, CLIENTES.NOME AS NOME_CLIENTE, CAST(SUM(VENDAMESTRE.TOTALVENDA) AS FLOAT) AS TOTAL_VENDIDO FROM VENDAMESTRE INNER JOIN CLIENTES ON (VENDAMESTRE.CLIENTE=CLIENTES.CODIGO) UNION ALL SELECT CLIENTES.CODIGO, CLIENTES.NOME AS NOME_CLIENTE, CAST(SUM(SERVICOMESTRE.TOTALFINAL) AS FLOAT) AS TOTAL_VENDIDO FROM SERVICOMESTRE INNER JOIN CLIENTES ON (SERVICOMESTRE.CLIENTE=CLIENTES.CODIGO) ) ORDER BY TOTAL_VENDIDO DESC
GOSTEI 0