Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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
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
Tente algo como meu segundo exemplo.
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
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.
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