Fórum Order BY em Select com Union #60288

11/11/2008

0

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.


Armindo

Armindo

Responder

Posts

11/11/2008

Emerson Nascimento

tente assim:
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
OU
ORDER BY
  3 DESC



Responder

Gostei + 0

12/11/2008

Armindo

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.


tente assim:
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
OU
ORDER BY
  3 DESC



Responder

Gostei + 0

12/11/2008

Emerson Nascimento

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.


Responder

Gostei + 0

12/11/2008

Armindo

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.


Responder

Gostei + 0

08/12/2008

Webjoel

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



Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar