Ir para conteúdo

POWERED BY:

Arquivado

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

Dalto Blanco

Condição no SQL

Recommended Posts

Boa tarde galera, estou precisando de ajuda em um SELECT.

Segue abaixo o código.

Precisava que a ligação com a tabela Cidades fosse feita com a tabela [Geral Propriedades], caso não exista cadastro na tabela [Geral Propriedades], a tabela Cidades deverá ser relacionada com a tabela Geral. Existe alguma maneira de gerar essa condição no SQL?

 

SELECT
[Nota Fiscal].[Número da NFe],
[Nota Fiscal].[Número da Nota], 
Geral.Nome,
Geral.Fone,
Pedido.[Venda Futura],
[Cadastro Sementes].[Nome Popular],
[Cadastro Sementes].[Código da Semente],
Pedido.[Número do Pedido],
Pedido.[Ano da Safra],
SUM(Pedido.[Descontos do Pedido]) AS [Total dos Descontos],
SUM(Pedido.[Total do Reembolso]) As [Total do Reembolso],
SUM([itens do Pedido].[Peso Item Pedido]) AS [Peso Kg],
[itens do Pedido].[Valor Por Quilo],
SUM([itens do Pedido].[Números de Sacos Devolvidos] * ([itens do Pedido].[Peso Item Pedido] / [itens do Pedido].[Números de Sacos])) AS Devolvido

FROM
Geral INNER JOIN Pedido
ON Geral.[Código Geral] = Pedido.[Código Geral]
INNER JOIN [Nota Fiscal]
ON Pedido.[Número do Pedido] = [Nota Fiscal].[Número do Pedido]
AND [Nota Fiscal].[Ano da Safra] = Pedido.[Ano da Safra]
INNER JOIN [itens do Pedido]
ON Pedido.[Número do Pedido] = [itens do Pedido].[Número do Pedido]
AND [itens do Pedido].[Ano da Safra] = Pedido.[Ano da Safra]
INNER JOIN Lotes
ON [itens do Pedido].[Número do Lote] = Lotes.[Número do Lote]
AND [itens do Pedido].[Ano da Safra] = Lotes.[Ano da Safra]
INNER JOIN [Cadastro Sementes]
ON Lotes.[Código da Semente] = [Cadastro Sementes].[Código da Semente]
LEFT OUTER JOIN Cidades
ON Geral.[Cod Cidade] = Cidades.[Cod Cidade]
LEFT JOIN [Geral Propriedades]
ON [Geral Propriedades].[Cod Cidade] = Cidades.[Cod Cidade]  

WHERE
" & Filtro() & " 'Filtro de datas e pedidos

GROUP BY
[Nota Fiscal].[Número da NFe],
[Nota Fiscal].[Número da Nota],
Geral.Nome,
Geral.Fone,
Pedido.[Venda Futura],
[Cadastro Sementes].[Nome Popular],
Pedido.[Número do Pedido],
Pedido.[Ano da Safra],
[itens do Pedido].[Valor Por Quilo],
[Cadastro Sementes].[Código da Semente]

ORDER BY
[Cadastro Sementes].[Código da Semente],
Pedido.[Número do Pedido]

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma seria possível (entre outras) seria montar uma VIEW que faça uma união entre as duas tabelas

 

create or replace view v_geral as
select codigo , nome
from Geral_Propriedades
union all
select codigo , nome
from Geral

 

No SELECT se usaria a VIEW.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma seria possível (entre outras) seria montar uma VIEW que faça uma união entre as duas tabelas

 

create or replace view v_geral as
select codigo , nome
from Geral_Propriedades
union all
select codigo , nome
from Geral

 

No SELECT se usaria a VIEW.

 

Mas se criar um VIEW para fazer um relacionamento com a tabela Cidade com [Geral Propriedades] e outro VIEW com relacionamento da tabela Geral com Cidades e um UNION ALL entre as duas não irei atingir meu objetivo, pois pode haver algum cadastro na tabela Geral que existe um cadastro relacionado na tabela [Geral Propriedades], sendo assim a consulta irá retornar dados da tabela Cidades referente a tabela Geral e os mesmo dados da tabela Geral que relacionados esta relacionado Cidades com a tabela [Geral Propriedades].

Compartilhar este post


Link para o post
Compartilhar em outros sites

1) um NOT IN

 

create or replace view v_geral as
select codigo , nome
from Geral_Propriedades
where codigo not in (select codigo from Geral)
union all
select codigo , nome
from Geral

 

 

2) Uma estrutura com OUTER JOIN e testando chave nulos com uma condição OR para a utra chave seria possível mas deve ficar lenta.

 

O Objetivo é obter apenas o Nome da cidade ,não ?

 

Uma function que receba um código e retorne o nome fazendo o tratamento descrito seria também uma solução.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Deixe-me tentar ser mais claro.

Preciso que esse SELECT me retorne os dados de um Pedido, esse pedido possui um cliente cadastrado na tabela Geral, o cadastro desse cliente possui endereço o qual tem um relacionamento com cidades. O cliente cadastrado na na tabela Geral pode possuir dados de uma propriedade, o qual é inserido na tabela [Geral Propriedades] e tal tabela também possui relacionamento com a tabela Cidades e se o pedido foi faturado para a propriedade do cliente a tabela Cidades deve ser relacionada com [Geral Propriedades], mas se o pedido foi faturado para o cliente que não possui propriedade, a tabela Cidades deverá ser relacionada com a tabela Geral.

 

Não sei como fazer isso, estava pensando em inserir uma condição para relacionar a tabela, mas eu preciso abrir as duas para poder fazer essa verificação. Penso que essa condição deverá ser feita no WHERE... você acha que minha idéia tem sentido?

Compartilhar este post


Link para o post
Compartilhar em outros sites
... se o pedido foi faturado para a propriedade do cliente a tabela Cidades deve ser relacionada com [Geral Propriedades], mas se o pedido foi faturado para o cliente que não possui propriedade, a tabela Cidades deverá ser relacionada com a tabela Geral. ...

 

Tente não declarar o JOIN (implicito) e faça a condição no WHERE, provavelmente deve ficar lento.

 

 

algo assim

 

select ...
from cidades,propriedades_geral,geral,...
where ...
and    (
      (status = 'P' /*propriedade do cliente*/ 
      and 
      cidades.id = propriedades_geral.id_cidade)
      or
      (status <> 'P' /*cliente*/ 
      and 
      cidades.id = geral.id_cidade)
     )
...

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.