Ir para conteúdo

Arquivado

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

fabio.silva

Select Condicional

Recommended Posts

Boa tarde a todos,

 

Meu primeiro post é sobre um select cavernoso (para o meu conhecimento) que tenho que fazer meio urgente no trabalho.

o google nao me ajudou pois eu nem sei como perquisar.

Eu tenho um select que seleciona varios campos de varias tabelas, uma das tabelas me fornece o TIPRRSTRICAO. o problema é que para cada tipo de restriçao muda algumas tabelas e joins.. na queri abaixo eu travei em um tipo de restriçao pois se eu pegar todas vai ferrar o resultado.

EX quando o tiprestricao é I eu posso dar este join: INNER JOIN TGFPRO P ON P.GRUPOICMS = ICM.CODRESTRICAO

mas se o tipo for x por exemplo eu ja tenho que chamar outra tabela que nem esta neste select!

 

 

 

 

SELECT P.CODPROD, P.DESCRPROD,e.vlrvenda, UFS1.DESCRICAO AS UFORIG, UFS2.DESCRICAO AS UFDEST,
ICM.TIPRESTRICAO,ICM.CODRESTRICAO,ICM.CODRESTRICAO2,ICM.ALIQUOTA, ICM.REDBASE, ICM.CODTRIB,ICM.ALIQSUBTRIB

FROM
TGFICM ICM
INNER JOIN TSIUFS UFS1 ON UFS1.CODUF = ICM.UFOrig
INNER JOIN TSIUFS UFS2 ON UFS2.CODUF = ICM.UFDEST
INNER JOIN TGFPRO P ON P.GRUPOICMS = ICM.CODRESTRICAO
INNER JOIN TGFEXC e ON e.codprod = p.CODPROD	
 WHERE
TIPRESTRICAO = 'I'
 AND ICM.CODTRIB = '10'
 AND p.CODPROD <> 0
 AND p.USOPROD <> 'S'
 AND e.nutab = (
  SELECT MAX(e2.nutab)
  FROM TGFEXC e2
  INNER JOIN TGFTAB b2 ON e2.nutab = b2.nutab
  WHERE p.CODPROD = e2.codprod
  AND B2.CODTAB = 0
  )
 ORDER BY UFS1.CODUF, UFS2.CODUF,TIPRESTRICAO

 

Eu precisaria de algo do tipo: se restriçao x faça tal select join etc.. se restriçao y faça este outro select joins etc..

 

Será que algem me entendeu?? fico muito grato por qualquer ajuda... obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vejo duas soluções

 

1) Montar uma VIEW que uma as tabelas que seriam juntadas , o join seria nesta VIEW , algo como

 

create or replce view v_colaboradores
as
select cpf,nome
from funcionarios
union
select cpf,nome
for terceirizados

 

No caso o join seria em v_colaboradores

 

2) Criar uma FUNCTION para retornar o valor que quer tratando a busca em uma tabela ou outra , algo como

 

create or replace function f_colab(pcpf in number) return char
is
vsai char(30);
begin
 begin
   select nome into vsai from funcionarios where cpf = pcpf;
 exception
   when others then
      select nome into vsai from terceirizados where cpf = pcpf;
 end;
end;

 

select f_colab(cpf)
from movimentos
where ...

 

Ajudou ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu meio que estava pensando que teria mesmo que ser feito uma view ou uma function, nao pensei nas duas ao mesmo tempo.

O seu codigo já ajudou mais ainda teria que adapta-lo. eu preciso de 8 situaçoes diferentes, exemplo:

Quando tiprestriçao = i eu faço inner join p.grupoicms = i.tiprestricao.

quando || = p tem que ser inner join p.codprod = i.tiprestricao

quando || = O é inner join t.codop = i.tiprestriçao

etc...

 

Ai eu acho que no function eu deveria usar o case nao é mesmo?? vou dar uma pesquisada no que você falou e tentar fazer a function.. o problema é que isso é um relatorio e tenho receio de que o formatador de relatorio nao de conta desses codigos mais avançados!

Ja estou mais perto da soluçao...

Obrigado por enquanto!

fabio

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nunca tive problemas com geradores de relatórios com FUNCTIONS (Crystal Reports e aquele do Delphi).

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.