Select (Condição)

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
batofao
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 40
Registrado em: Seg, 30 Ago 2010 9:47 am
Localização: Jundiai

pessoal, bom dia

tenho o seguinte select

Selecionar tudo

SELECT DISTINCT RE.EMISSOR, RE.ATIVO, RE.PASSIVO_TOTAL_PORC, 
RE.NET_TOTAL_PORC, RF.NOME_CLIENTE, RE.RATING,
RF.TIPO, TC.NOME,RF.LIMITE_POLITICA
  FROM CONTRAPARTES_META CM, REL_ENQUADRAMENTO_EMISSOR RE, TIPOS_CONTRAPARTE TC, ZXT_ENQ_RF RF
  WHERE CM.NOME = substr(RE.EMISSOR, 1, length(RE.EMISSOR)- 7)
  AND CM.COD_TIPO_CONTRAPARTE = TC.COD_TIPO_CONTRAPARTE
  AND TC.NOME = RF.TIPO 
  AND RE.RATING = RF.RATING
  AND   RE.COD_REL_APURACAO_FORM = (SELECT COD_REL_APURACAO_FORM  FROM REL_APURACAO_FORMS WHERE COD_REL_APURACAO IN 
  (SELECT CODIGO FROM REL_APURACAO WHERE NOME= 
  (SELECT DISTINCT ZX.NOME_CLIENTE || '_' || 
  EXTRACT(month from RA.DATA_FINAL)|| '_' || 
  EXTRACT(year from RA.DATA_FINAL) AS NOME_DATA
  FROM ZXT_ENQ_RF ZX, REL_APURACAO RA
  WHERE RA.DATA_FINAL = (:DATA_FINAL)
  AND ZX.NOME_CLIENTE = (:NOME_CLIENTE))) 
  AND COD_FORM = -717 
  AND NOME_FORM  LIKE '%Sem Futuros%')
  ORDER BY RE.EMISSOR
o que acontece, a ideia é mostrar um campo chamado LIMITE_POLITICA que esta em outra tabela, porem o que acontece quando tenho a condição:

Selecionar tudo

 AND TC.NOME = RF.TIPO 
  AND RE.RATING = RF.RATING


tenho alguns "EMISSORES" que não se encaixam nessa regra, porem eu teria que mostra-los mesmo que o LIMITE_POLITICA não existisse e com essa regra não consigo porem preciso dela para casar os dados, sera que usando um if sei la.. alguma coisa parecida...

não sei se fui muito claro...

obg..
gfkauer
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 389
Registrado em: Ter, 27 Jul 2010 1:34 pm
Localização: Sapiranga - RS
Contato:
Quem falou que programar era fácil??

Quanto mais dificil for a implementação mais valorizado seu trabalho será!

Acessem: www.gfkauer.com.br

E que tal um outer join?

Selecionar tudo

Select Distinct re.emissor,
                re.ativo,
                re.passivo_total_porc,
                re.net_total_porc,
                rf.nome_cliente,
                re.rating,
                rf.tipo,
                tc.nome,
                rf.limite_politica
  From contrapartes_meta         cm,
       rel_enquadramento_emissor re,
       tipos_contraparte         tc,
       zxt_enq_rf                rf
 Where cm.nome = substr(re.emissor, 1, length(re.emissor) - 7)
   And cm.cod_tipo_contraparte = tc.cod_tipo_contraparte
   And tc.nome(+) = rf.tipo
   And re.rating(+) = rf.rating
   And re.cod_rel_apuracao_form =
       (Select cod_rel_apuracao_form
          From rel_apuracao_forms
         Where cod_rel_apuracao In
               (Select codigo
                  From rel_apuracao
                 Where nome = (Select Distinct zx.nome_cliente || '_' ||
                                               extract(Month From ra.data_final) || '_' ||
                                               extract(Year From ra.data_final) As nome_data
                                 From zxt_enq_rf   zx,
                                      rel_apuracao ra
                                Where ra.data_final = (:data_final)
                                  And zx.nome_cliente = (:nome_cliente)))
           And cod_form = -717
           And nome_form Like '%Sem Futuros%')
 Order By re.emissor
Acho q seria isso pelo que entendi...
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

sinceramente não entendi muito bem seu problema..

por isso segue um exemplo de decode..

Selecionar tudo

--- onde ?????? pode ser 10000, 10001 ou 10002
SELECT decode(????,
              10000,
              'IBM',
              10001,
              'Microsoft',
              10002,
              'Hewlett Packard',
              'Gateway') result
  FROM dual;
batofao
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 40
Registrado em: Seg, 30 Ago 2010 9:47 am
Localização: Jundiai

gfkauer,

o conceito é este mesmo, porem essa consulta me retornou os mesmos valores...


valeu..
SergioLBJr
Rank: Oracle Guru
Rank: Oracle Guru
Mensagens: 448
Registrado em: Ter, 16 Jun 2009 3:07 pm
Localização: Parobé - RS
Sérgio Luiz Bonemberger Junior
Programador Junior
Parobé RS

[]s

Cara, pelo que tu ta postando aí o outer join deveria estar funcionando, tenta troca ele de lado(não conheço a regra do negocio).

Atente para as demais condições da sua query, o outer join vai retornar os registros mesmo que eles não atendam o join, porém os demais filtros irão incidir sobre estes registros retornados. Logo certifique-se que não existe mais nada no where que possa estar barrando. Se existir alguma outra condiçao que estes registros não estão atendendo entçao tu vai ter dois caminhos, ou mexer na tua condição (colocar um and exists para ela não incidir sobre os registros retornados do outer join) ou fazer com que estes registros retornem em um union sem a condição que os esta barrando.

qualquer duvida posta aí..
batofao
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 40
Registrado em: Seg, 30 Ago 2010 9:47 am
Localização: Jundiai

já encontrei um erro quando tenho a condição:

Where cm.nome = substr(re.emissor, 1, length(re.emissor) - 7)

tenho uma nome EX: HSBC (****) onde revomo 7 caracteres para comparar com outro nome o pessoal aqui do cadastro inseriu um nome errado no sistema HSBC (*****) , dai o erro da comparação.. agora me tira uma duvida
abaixo esta os nomes que eu posso ter:

Selecionar tudo

BCO BMG SA (BMGB)
BCO BNP PARIBAS BRASIL SA (BBNP)
BCO BRADESCO SA (****)
BCO BRASIL SA (*****)
tem como eu usar o substr para chegar exatamente no nome mesmo que haja erro na digitação? considerando que o erro seja depois do nome né se não nem pai de santo advinha..kkk

obg..


[/code]
SergioLBJr
Rank: Oracle Guru
Rank: Oracle Guru
Mensagens: 448
Registrado em: Ter, 16 Jun 2009 3:07 pm
Localização: Parobé - RS
Sérgio Luiz Bonemberger Junior
Programador Junior
Parobé RS

[]s

Sempre é complicado driblar erros de digitação, porque o usuário faz cada absurdo que só vendo

vê se o sql abaixo te atende

Selecionar tudo

SELECT TRIM(SUBSTR('BCO BMG SA (BMGB)', 0,  INSTR('BCO BMG SA (BMGB)', '(')-1)) FROM dual
batofao
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 40
Registrado em: Seg, 30 Ago 2010 9:47 am
Localização: Jundiai

perfeito !!!!

não tenho ainda o resultado esperado, estou olhando minhas condições, deve ter alguma que não esta sendo usada corretamente.

do mais muito obrigado...
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Olá,

Posta por gentileza os casos que ainda apresentam problema, para vermos se tem algum padrão que dê para identificar ou corrigir.
batofao
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 40
Registrado em: Seg, 30 Ago 2010 9:47 am
Localização: Jundiai

Olá,

muito obrigado pela ajuda, o problema foi resolvido, na verdade as minhas condições estavam todas corretas, o problema todo era cadastro, itens que estavam fora do padrão... mais já esta ok...


tks..
Responder
  • Informação