Distinct

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
Avatar do usuário
pablo.verly
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 17
Registrado em: Qua, 01 Dez 2010 7:17 am
Localização: es
T.I Santa Casa Vitoria

Mensagem Autor
Enviada: Qui, 20 Jan 2011 9:21 am Assunto: Linhas repetidas

--------------------------------------------------------------------------------

Puts não estou conseguindo fazer com que o campo cd_reg_fat_previa não traga valores repetidos.-
----------------------------------------

Selecionar tudo

Select 
--rownum linha, 
distinct Cd_Reg_Fat_Previa 
, SN_Proced_Realizado 
, SN_Eqp_Medica 
, Ds_Organiza_Grupo_Procedimento 
, Cd_Grupo_Procedimento 
, Cd_Sub_Grupo_Procedimento 
, Cd_Organiza_Grupo_Procedimento 
, Vl_SH_Principal 
, Vl_SH_Proprio 
, Vl_SH_Terceiro 
, Vl_SP_Proprio 
, Vl_SP_Terceiro 
, Vl_SP_RATEIO_Proprio 
, Vl_SP_RATEIO_Terceiro 
, VL_TOTAL_CONTA 
, cd_remessa 
, dt_competencia 
, ds_remessa 

From (Select distinct Cd_Reg_Fat_Previa 
, SN_Proced_Realizado 
, SN_Eqp_Medica 
, VL_TOTAL_CONTA 
,dt_competencia 
, cd_remessa 
, Ds_Organiza_Grupo_Procedimento 
, Cd_Grupo_Procedimento 
, Cd_Sub_Grupo_Procedimento 
, Cd_Organiza_Grupo_Procedimento 
, ds_remessa 
-- Serviço Hospitalar 
-- Serviço Hospitalar 
, Sum(Vl_SH_Principal) Vl_SH_Principal 
, sum(Vl_SH_Proprio) Vl_SH_Proprio 
, sum(Vl_SH_Terceiro) Vl_SH_Terceiro 
-- Serviço Profissional 
, sum(Vl_SP_Proprio) Vl_SP_Proprio 
, sum(Vl_SP_Terceiro) Vl_SP_Terceiro 
, sum(Vl_SP_RATEIO_Proprio) Vl_SP_RATEIO_Proprio 
, sum(Vl_SP_RATEIO_Terceiro) Vl_SP_RATEIO_Terceiro 
-- , VL_TOTAL_CONTA 
From (Select distinct Cd_Reg_Fat_Previa Cd_Reg_Fat_Previa 
, SN_Proced_Realizado SN_Proced_Realizado 
, SN_Eqp_Medica SN_Eqp_Medica 
, SN_Admite_longa_Permanencia SN_Admite_longa_Permanencia 
, vl_total_conta VL_TOTAL_CONTA 
, Ds_Organiza_Grupo_Procedimento Ds_Organiza_Grupo_Procedimento 
, Cd_Grupo_Procedimento Cd_Grupo_Procedimento 
, Cd_Sub_Grupo_Procedimento Cd_Sub_Grupo_Procedimento 
, Cd_Organiza_Grupo_Procedimento Cd_Organiza_Grupo_Procedimento 
, cd_remessa cd_remessa 
, dt_competencia dt_competencia 
, ds_remessa ds_remessa 
-- Serviço Hospitalar 
, Decode(SN_Admite_longa_Permanencia 
,'S',sum(Vl_SH_Longa_PM) 
,VL_SH_Principal) Vl_SH_Principal 
, Sum(Vl_SH_Longa_PM) Vl_SH_Longa_PM 
, Sum(Decode(SN_OPM,'S',Decode(Cd_Tipo_Vinculo , 3 , Null 
, Vl_SH_Proprio),Vl_SH_Proprio)) Vl_SH_Proprio 
, Sum(Decode(SN_OPM,'S',Decode(Cd_Tipo_Vinculo , 3 , Vl_SH_Terceiro 
, Null), Null)) Vl_SH_Terceiro 
-- Serviço Profissional 
, Sum(Decode(Cd_Tipo_Vinculo , 3 , Null 
, Vl_SP_Proprio )) Vl_SP_Proprio 
, Sum(Decode(Cd_Tipo_Vinculo , 3 , Vl_SP_Terceiro 
, Null)) Vl_SP_Terceiro 
, sum(Vl_SP_RATEIO_Proprio) Vl_SP_RATEIO_Proprio 
, sum(Vl_SP_RATEIO_Terceiro) Vl_SP_RATEIO_Terceiro 
-- , vl_total_conta VL_TOTAL_CONTA 
From ( Select distinct ItReg_Fat.Cd_Reg_Fat Cd_Reg_Fat_Previa 
, ItReg_Fat.Cd_Lancamento Cd_Lancamento 
, decode(ItReg_Fat.Cd_Procedimento, '0412010127', 'S', ItReg_Fat.SN_Proced_Realizado) SN_Proced_Realizado 
,fatura.dt_competencia dt_competencia 
,REMESSA_FATURA.cd_remessa cd_remessa 
, OGP.Cd_Grupo_Procedimento Cd_Grupo_Procedimento 
,OGP.Cd_Sub_Grupo_Procedimento Cd_Sub_Grupo_Procedimento 
, OGP.Cd_Organiza_Grupo_Procedimento Cd_Organiza_Grupo_Procedimento 
, OGP.Ds_Organiza_Grupo_Procedimento Ds_Organiza_Grupo_Procedimento 
, reg_fat.vl_total_conta VL_TOTAL_CONTA 
, remessa_fatura.ds_remessa ds_remessa 

-- Parametros para apoio 


, Decode( ItLan_Med.Cd_Prestador , Null , 'N' 
, 'S') SN_Eqp_Medica 
, PDetal.SN_Ortese_Protese SN_OPM 
, Decode( PDetal.SN_Ortese_Protese , 'S' , ItCob_Pre.Cd_Fornecedor 
, Decode( ItLan_Med.Cd_Prestador , Null , ItReg_Fat.Cd_Prestador 
, ItLan_Med.Cd_Prestador)) Cd_Prestador 
, SN_Admite_longa_Permanencia SN_Admite_longa_Permanencia 
-- Definição do tipo de vnculo 
, Decode( PDetal.SN_Ortese_Protese , 'S' , Dbamv.Fnc_FFIS_Define_Vinculo_OPM(ItCob_Pre.Cd_Fornecedor) 
, Decode( ItLan_Med.Cd_Prestador , Null , ItReg_Fat.Cd_Tipo_Vinculo 
, ItLan_Med.Cd_Tipo_Vinculo)) Cd_Tipo_Vinculo 
-- Serviço Hospitalar 
, ItReg_Fat.Vl_SH Vl_SH_Principal 
, ItReg_Fat.Vl_SH Vl_SH_Longa_PM 
, ItReg_Fat.Vl_SH Vl_SH_Proprio 
, ItReg_Fat.Vl_SH Vl_SH_Terceiro 
-- Serviço Profissional 
, decode(PDetal.sn_exige_cpf_cbo,'N', decode(sn_diaria_uti, 'N',0 , Decode(Decode( PDetal.SN_Ortese_Protese , 'S' , Dbamv.Fnc_FFIS_Define_Vinculo_OPM(ItCob_Pre.Cd_Fornecedor) 
, Decode( ItLan_Med.Cd_Prestador , Null , ItReg_Fat.Cd_Tipo_Vinculo 
, ItLan_Med.Cd_Tipo_Vinculo)), 3, null 
, Decode(ItLan_Med.Cd_Prestador , Null , Decode (Nvl(itreg_fat.qt_pontos,0), 0, ItReg_Fat.Vl_SP 
, null) 
, Decode (Nvl(ItLan_Med.qt_pontos,0), 0, ItLan_Med.Vl_Ato 
, null)))) , 
Decode(Decode( PDetal.SN_Ortese_Protese , 'S' , Dbamv.Fnc_FFIS_Define_Vinculo_OPM(ItCob_Pre.Cd_Fornecedor) 
, Decode( ItLan_Med.Cd_Prestador , Null , ItReg_Fat.Cd_Tipo_Vinculo 
, ItLan_Med.Cd_Tipo_Vinculo)), 3, null 
, Decode(ItLan_Med.Cd_Prestador , Null , Decode (Nvl(itreg_fat.qt_pontos,0), 0, ItReg_Fat.Vl_SP 
, null) 
, Decode (Nvl(ItLan_Med.qt_pontos,0), 0, ItLan_Med.Vl_Ato 
, null))) 

) Vl_SP_Proprio 
-- 
, Decode(Decode( PDetal.SN_Ortese_Protese , 'S' , Dbamv.Fnc_FFIS_Define_Vinculo_OPM(ItCob_Pre.Cd_Fornecedor) 
, Decode( ItLan_Med.Cd_Prestador , Null , ItReg_Fat.Cd_Tipo_Vinculo 
, ItLan_Med.Cd_Tipo_Vinculo)), 3, Decode(ItLan_Med.Cd_Prestador , Null , Decode (Nvl(itreg_fat.qt_pontos,0), 0, ItReg_Fat.Vl_SP 
, null) 
, Decode (Nvl(ItLan_Med.qt_pontos,0), 0, ItLan_Med.Vl_Ato 
, null)) 
, null) Vl_SP_Terceiro 
-- 
, Decode(Decode( PDetal.SN_Ortese_Protese , 'S' , Dbamv.Fnc_FFIS_Define_Vinculo_OPM(ItCob_Pre.Cd_Fornecedor) 
, Decode( ItLan_Med.Cd_Prestador , Null , ItReg_Fat.Cd_Tipo_Vinculo 
, ItLan_Med.Cd_Tipo_Vinculo)), 3, 0 
, Decode(ItLan_Med.Cd_Prestador , Null , Decode (Nvl(Itreg_fat.qt_pontos,0), 0, 0 
, ItReg_Fat.Vl_SP) 
, Decode (Nvl(ItLan_Med.qt_pontos,0), 0, 0 
, ItLan_Med.Vl_Ato)) )Vl_SP_RATEIO_Proprio 
-- 
, Decode(Decode( PDetal.SN_Ortese_Protese , 'S' , Dbamv.Fnc_FFIS_Define_Vinculo_OPM(ItCob_Pre.Cd_Fornecedor) 
, Decode( ItLan_Med.Cd_Prestador , Null , ItReg_Fat.Cd_Tipo_Vinculo 
, ItLan_Med.Cd_Tipo_Vinculo)), 3, Decode(ItLan_Med.Cd_Prestador , Null , Decode (Nvl(Itreg_fat.qt_pontos,0), 0, 0 
, ItReg_Fat.Vl_SP) 
, Decode (Nvl(ItLan_Med.qt_pontos,0), 0, 0 
, ItLan_Med.Vl_Ato)) 
, null) Vl_SP_RATEIO_Terceiro 

From Dbamv.ItReg_Fat ItReg_Fat 
, Dbamv.ItLan_Med ItLan_Med 
, Dbamv.ItCob_Pre ItCob_Pre 
, Dbamv.Procedimento_SUS_Detalhe PDetal 
, Dbamv.Organiza_Grupo_Procedimentos OGP 
, DBAMV.reg_fat reg_fat 
, REMESSA_FATURA REMESSA_FATURA 
, FATURA FATURA 
Where ItReg_Fat.Cd_Reg_Fat = ItLan_Med.Cd_Reg_Fat (+) 
And ItReg_Fat.Cd_Lancamento = ItLan_Med.Cd_Lancamento (+) 
And ItReg_Fat.Cd_Reg_Fat = ItCob_Pre.Cd_Reg_Fat (+) 
And ItReg_Fat.Cd_lancamento = ItCob_Pre.Cd_lancamento (+) 
and ItReg_Fat.sn_proced_realizado = 'S' 
And ItReg_Fat.sn_pertence_pacote = 'N' 
And PDetal.Cd_Procedimento = ItReg_Fat.Cd_Procedimento 
AND ITREG_FAT.cd_reg_fat = reg_fat.cd_reg_fat 
AND REG_FAT.cd_remessa = REMESSA_FATURA.cd_remessa 
AND FATURA.cd_fatura = REMESSA_FATURA.cd_fatura 
and remessa_fatura.ds_remessa like 'AIH-ALTA COMPLEXIDADE%' 
-- And ItReg_Fat.cd_procedimento not in ('0702050814','0702050091') 
-- and itreg_fat.cd_reg_fat = 18581 
-- and substr(itreg_fat.cd_procedimento,1,6) = '020602' 
-- and remessa_fatura.cd_remessa = 200 
And OGP.Cd_Grupo_Procedimento = Substr(PDetal.Cd_Procedimento,1,2) 
And OGP.Cd_Sub_Grupo_Procedimento = Substr(PDetal.Cd_Procedimento,3,2) 
And OGP.Cd_Organiza_Grupo_Procedimento = Substr(PDetal.Cd_Procedimento,5,2) 
And ((PDetal.SN_AIH_Principal = 'S' 
Or PDetal.sn_aih_especial = 'S') 
Or (PDetal.SN_AIH_Principal = 'N' 
And PDetal.sn_aih_especial = 'N' 
And nvl(ItReg_Fat.vl_sp, 0) > 0)) 
) 
Group By Ds_Organiza_Grupo_Procedimento 
, Cd_Grupo_Procedimento 
, Cd_Sub_Grupo_Procedimento 
, Cd_Organiza_Grupo_Procedimento 
, VL_TOTAL_CONTA 
, cd_remessa 
,dt_competencia 
,ds_remessa 
, Cd_Reg_Fat_Previa 
, Decode(SN_Proced_Realizado,'S',Cd_Lancamento,Null) 
, Vl_SH_Principal 
, SN_Proced_Realizado 
, SN_Eqp_Medica 
, SN_Admite_longa_Permanencia) 
Group by Cd_Reg_Fat_Previa 
, SN_Proced_Realizado 
, SN_Eqp_Medica 
, cd_remessa 
,dt_competencia 
, VL_TOTAL_CONTA 
,ds_remessa 
, Cd_Grupo_Procedimento 
, Cd_Sub_Grupo_Procedimento 
, Cd_Organiza_Grupo_Procedimento 
, Ds_Organiza_Grupo_Procedimento) 
-- where Cd_Reg_Fat_Previa in '3541' 
-- and ItReg_Fat.sn_proced_realizado = 'S' 
--WHERE remessa_fatura.cd_remessa = 135 
Group By rownum , Cd_Reg_Fat_Previa , SN_Proced_Realizado , SN_Eqp_Medica 
, VL_TOTAL_CONTA 
, cd_remessa 
,ds_remessa 
,dt_competencia 
, Cd_Grupo_Procedimento 
, Cd_Sub_Grupo_Procedimento 
, Cd_Organiza_Grupo_Procedimento, Ds_Organiza_Grupo_Procedimento , Vl_SH_Principal , Vl_SH_Proprio , Vl_SH_Terceiro , Vl_SP_Proprio , Vl_SP_Terceiro , Vl_SP_RATEIO_Proprio , Vl_SP_RATEIO_Terceiro 
Order By cd_remessa 
--------------------------------------------------

resultado (principais colunas)

Selecionar tudo

cd_reg_fat_previa | ds_organiza_grupo | vl_total_contaotal 
... 
..... 
1598 | PAREDE E CAVIDADE ABDOMINAL       |6385,9 
1598 | COLO-PROCTOLOGIA                  |6385,9 
1659 | COLUNA VERTEBRAL E CAIXA TORÁCICA |3523,84 
1797 | MEMBROS INFERIORES                |1131,79 
... 
...... 
_________________
Avatar do usuário
tiagodutra
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 7
Registrado em: Qua, 19 Jan 2011 2:50 pm
Localização: Novo Hamburgo - RS
Tiago

Bom dia,

Cara o Distintc só retira as linhas que retornam exatamente iguais se qualquer colula do teu select for diferente por minimo que seja da ele vai retornar 2 linhas com mesmo códido de "Cd_Reg_Fat_Previa"
No exemplo que você deixou as 2 linhas do códogo "1598" vem com valores diferentes nas demais colunas, acho que o Distinct não vai te ajudar nesse caso.
Avatar do usuário
pablo.verly
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 17
Registrado em: Qua, 01 Dez 2010 7:17 am
Localização: es
T.I Santa Casa Vitoria

Alguma ideia?
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

so uma dica..
quando você bota a sua qeury sem serpara os trechos e tal você faz com que alguns deixem de te ajudar.. tente expor melhor sempre seu problema.. não se atente a solução que você pensou.. exponha o problema pois outras soluções podem surgir..


voltando ao seu problema..
acho q não ta agrupando em suas subquery(pelo menos não achei).. você tem q ver a origem do campo descrição que ta causando a duplicidade no retorno da sua query e la na origem agrupar o dado pelo seu campo cd_reg_fat_previa
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á,

De experiência própria, 95% das vezes que as pessoas usam o Distinct ele não é necessário, e é incorreto. Ele está sendo usado para corrigir alguma falha no join que produziu um produto cartesiano.

No seu lugar, eu iria explorando a query pedaço a pedaço: pegue uma parte do FROM, estude a tabela de origem e seus dados, teste sem distinct e incremente com mais uma tabela.

Repita isso passo a passo até produzir o resultado correto.

É claro que eu posso estar enganado e você de fato precisar do distinct, mas geralmente não é o caso. Isso só podemos afirmar conhecendo o conteúdo das tabelas e os relacionamento entre elas.

Se você quiser uma ajuda mais completa, poste sua estrutura de tabelas e dados de exemplo (create table e inserts para podermos executar e testar nós mesmos). Simplifique, se por exemplo para nós reproduzirmos o problema só precisamos de 4 colunas, não poste com 20.

Poste também o resultado esperado, com o layout de colunas que você deseja ver para aqueles dados fornecidos e uma breve explicação da lógica que você quer implementar.
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 5 visitantes