Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

ZioNN

Stored Procedure - 2 consultas complementares em uma, como?

Recommended Posts

Pessoal, quebrando a cabeça com isso há dois dias, mas não consigo resolver por isso peço a ajuda de vocês.

Preciso listar estabelecimento comerciais de acordo com a distância do ponto fornecido pelo usuário. Todo o cálculo é baseado em latitude e longitude utilizando STDistance do SQL-Server. Até aí tudo bem.

A stored procedure recebe os parametros latitude, longitude do usuário e raio (distancia em km até onde vai buscar estabelecimentos)

O problema é que, nesta listagem, os 3 primeiros da lista devem ser obrigatoriamente os 3 estabelecimentos mais próximos do usuário que possuem contrato ATIVO com a empresa, ordenados por distância, e em seguida, deve exibir todos os demais, também em ordem de distância, misturando contratos ATIVOS e INATIVOS, sem repetir os 3 que já foram exibidos acima.

Algo como (resumidamente só para entendimento)

SELECT TOP 3 estabelecimento FROM vw_Estabelecimentos WHERE contrato_ativo = 1 ORDER BY distancia

SELECT estabelecimento FROM vw_Estabelecimentos ORDER BY distancia (que não duplique com o resultado da 1ª query)

Porém tudo isso numa query só pra retornar apenas um recordset. Já tentei com UNION de tudo que é jeito mas não consegui :(


Como resolver isso? Não sei se a informação é suficiente...se for necessário posto aqui a query original que é bem mais complexa.

Agradeço qualquer ajuda.

Obg

Compartilhar este post


Link para o post
Compartilhar em outros sites

Faça um order by assim

 

Order by (case contrato_ativo = 1 then 0 else 1 end),distancia

 

Separando os 3 primeiros na camada de visualização , os ativos devem sempre estar a frente dos não ativos, não !?

 

 

Ou algo assim ...

 

 

select estabelecimento

from

(

SELECT TOP 3 0 cquery,estabelecimento

FROM vw_Estabelecimentos

WHERE contrato_ativo = 1

union

SELECT 1 cquery estabelecimento

FROM vw_Estabelecimentos

)

 

ORDER BY cquery, distancia

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala Motta, obrigado por sua ajuda. No caso não, os 3 primeiros serão sempre ativos e ordenados por distancia, mas os que vem depois podem ser ativos ou não, e também são ordenados por distancia.

Um resultado possivel seria

empresa1 ativo 1.5Km

empresa2 ativo 2.7Km

empresa3 ativo 4.5Km

empresa4 inativo 2.1km

empresa5 ativo 5.7Km

empresa6 inativo 7.5Km

Ficou mais claro agora? Dificil explicar, rss

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu já tinha tentando de uma forma semelhante ao que você propôs mas neste caso o que acontece é que o UNION vai considerar o estabelecimento listado nos 3 primeiros itens novamente na segunda listagem, exibindo em duplicidade, pois ao fazer o DISTINCT na união das consultas ele vai enxergar essa nova coluna cquery e entender que são dois registros diferentes.

Me expliquei direito? rsss

Compartilhar este post


Link para o post
Compartilhar em outros sites

Coloque então um NOT IN ou NOT exists na seguanda sql do union se referindo a primeira sql , assim se retira de segunda o que foi exibido na primeira. A performance deve cair todavia.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.