Query de Relatório Eliminar Linhas Duplicadas

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
scudeler
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 7
Registrado em: Dom, 26 Set 2010 3:35 am
Localização: Joinville-SC

Bom dia.

Pessoal estou tentando criar uma query para um relatório, onde iriam existir vários produtos cada produto pode mudar de valor dependendo do Tipo de usuário.

Exemplo: O produto Nr 1 custa 100 para um Tipo de Usuário,
mas pode custar 120 para outro Tipo de Usuário.

O Mer desta parte da base seria o seguinte:

Selecionar tudo

PRODUTOS  1 ---------- N  PRODUTOS_TABELA  
Estas tabelas estão relacionadas pelo CD_PRODUTO que é a PK na PRODUTOS, já a PK da PRODUTOS_TABELA é o CD_PRODUTO + CD_TABELA.

No Relatório que Estou criando, os códigos das tabelas que devem aparecer estão em uma temporária, tendo um máximo de 6 Códigos de tabela nesta temporária chamada TMP_TABELAS.

Assim a disposição de campos pretendida é a seguinte:

Selecionar tudo

 
 CD_PRODUTO  |  NM_PRODUTO  | VALOR NA TABELA1  | VALOR NA TABELA2 | VALOR NA TABELA 3   ....
 
Não tem Problema se o Usuário informar Apenas 3 Códigos de tabelas na temporária e as outras 3 colunas de valor ficarem em branco ou com valor 0.


A dúvida que estou tendo é a seguinte como faço para que no relatório não existam linha duplicadas do mesmo produto ?
já pensei em fazer subquerys para cada Valor mas não vejo como
buscar valor diferentes da Temporaria de modo que os códigos dela buscados não se repitam na outra coluna.

Postei Nesta área pois estou usando comandos do PL/SQL e já tentei até criar funções para este relatório mas ainda
não obtive sucesso, me desculpem se minha questão é muito simples, mas não vejo como resolver este problema.

Agradeço desde já.
alexandervinson
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 29
Registrado em: Qua, 17 Nov 2010 8:29 am
Localização: Belem - Para

Selecionar tudo


select 
CD_PRODUTO  ,  NM_PRODUTO 
(select valor from PRODUTOS_TABELA, TMP_TABELAS tmp pt where p.CD_PRODUTO = pr.CD_PRODUTO 
and pt.cdtabela = tmp.cdtabela
and pt.cdtabela = 1 
) "VALOR NA TABELA1" ,
(select valor from PRODUTOS_TABELA, TMP_TABELAS tmp pt where p.CD_PRODUTO = pr.CD_PRODUTO 
and pt.cdtabela = tmp.cdtabela
and pt.cdtabela = 2 
) "VALOR NA TABELA2" ,
(select valor from PRODUTOS_TABELA, TMP_TABELAS tmp pt where p.CD_PRODUTO = pr.CD_PRODUTO 
and pt.cdtabela = tmp.cdtabela
and pt.cdtabela = 3 
) "VALOR NA TABELA3" 
-- por quantas tabelas tu quiseres

from 
PRODUTOS  p


este não é o codigo mais eficiente... mas garante que você vai mostar somente o que o usuário quer, e que esteja nas suas tabelas
scudeler
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 7
Registrado em: Dom, 26 Set 2010 3:35 am
Localização: Joinville-SC

opa, to pensando em fazer assim mesmo, mas tem um problema:

Os pt.cdtabela estão em uma tabela temporaria, como poderia me certificar que para cada subquery ele iria pegar um outro valor da tabela?

Na Temporaria não vao ter iguais porque coloquei como pk e já valido no forms, mas isso que não to achando solução: Como Pegar Valor Diferentes da Temporaria na Subquery?


obirgado pela ajuda.
alexandervinson
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 29
Registrado em: Qua, 17 Nov 2010 8:29 am
Localização: Belem - Para

Entendo...
Não é na ordem...

Vou te dar uma solução mas queira resaltar que não é elegante... mas deve atender aos teus requisistos :)

Selecionar tudo

select
CD_PRODUTO  ,  NM_PRODUTO
(select valor from PRODUTOS_TABELA where p.CD_PRODUTO = pr.CD_PRODUTO
and pt.cdtabela = (select tab_temp.cdtabela
                  from (selert tmp.cdtabela, rownum linha from TMP_TABELAS tmp ) tab_temp
                  where  tab_temp.linha = 1)
) "VALOR NA TABELA1" ,
(select valor from PRODUTOS_TABELA where p.CD_PRODUTO = pr.CD_PRODUTO
and pt.cdtabela = (select tab_temp.cdtabela
                  from (selert tmp.cdtabela, rownum linha from TMP_TABELAS tmp ) tab_temp
                  where  tab_temp.linha = 2)
) "VALOR NA TABELA2" ,
(select valor from PRODUTOS_TABELA where p.CD_PRODUTO = pr.CD_PRODUTO
and pt.cdtabela = (select tab_temp.cdtabela
                  from (selert tmp.cdtabela, rownum linha from TMP_TABELAS tmp ) tab_temp
                  where  tab_temp.linha = 3)
) "VALOR NA TABELA3" 

from
PRODUTOS  p 
 
scudeler
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 7
Registrado em: Dom, 26 Set 2010 3:35 am
Localização: Joinville-SC

Valeu mesmo Cara, deu certo aqui, o que importa é que atendeu as necessidade :D

Caso alguém Tenha mais Alguma sugestão para esta questão por favor poste aqui :)


segue abaixo como ficou :o

Selecionar tudo

select t.cd_produto
      ,t.nm_produto
      ,to_char(nvl((select a.vl_produto_pe 
                      from precos_produtos_tabela a
                     where a.CD_PRODUTO = t.CD_PRODUTO
                       and a.dt_inicio_vigencia = (select max(b.dt_inicio_vigencia)
                                                     from precos_produtos_tabela b
                                                    where b.cd_tabela = a.cd_tabela
                                                      and b.cd_produto = t.cd_produto)  
                       and a.cd_tabela = (select tab_temp.cd_tabela 
                                            from (select tmp.cd_tabela, rownum linha 
                                                    from TABELAS_2557 tmp 
                                                   order by 1 asc) tab_temp 
                                                   where tab_temp.linha = 1)),0),'FM999999999990D00') VALOR_NA_TABELA1
      ,to_char(nvl((select a.vl_filme
                      from precos_produtos_tabela a
                     where a.CD_PRODUTO = t.CD_PRODUTO
                       and a.dt_inicio_vigencia = (select max(b.dt_inicio_vigencia)
                                                     from precos_produtos_tabela b
                                                    where b.cd_tabela = a.cd_tabela
                                                      and b.cd_produto = t.cd_produto)  
                       and a.cd_tabela = (select tab_temp.cd_tabela 
                                            from (select tmp.cd_tabela, rownum linha 
                                                    from TABELAS_2557 tmp 
                                                   order by 1 asc) tab_temp 
                                                   where tab_temp.linha = 1)),0),'FM999999999990D00') VALOR_FILME_TABELA1
      ,to_char(nvl((select a.vl_produto_pe 
                      from precos_produtos_tabela a
                     where a.CD_PRODUTO = t.CD_PRODUTO
                       and a.dt_inicio_vigencia = (select max(b.dt_inicio_vigencia)
                                                     from precos_produtos_tabela b
                                                    where b.cd_tabela = a.cd_tabela
                                                      and b.cd_produto = t.cd_produto)  
                       and a.cd_tabela = (select tab_temp.cd_tabela 
                                            from (select tmp.cd_tabela, rownum linha 
                                                    from TABELAS_2557 tmp 
                                                   order by 1 asc) tab_temp 
                                                   where tab_temp.linha = 2)),0),'FM999999999990D00') VALOR_NA_TABELA2
      ,to_char(nvl((select a.vl_filme
                      from precos_produtos_tabela a
                     where a.CD_PRODUTO = t.CD_PRODUTO
                       and a.dt_inicio_vigencia = (select max(b.dt_inicio_vigencia)
                                                     from precos_produtos_tabela b
                                                    where b.cd_tabela = a.cd_tabela
                                                      and b.cd_produto = t.cd_produto)  
                       and a.cd_tabela = (select tab_temp.cd_tabela 
                                            from (select tmp.cd_tabela, rownum linha 
                                                    from TABELAS_2557 tmp 
                                                   order by 1 asc) tab_temp 
                                                   where tab_temp.linha = 2)),0),'FM999999999990D00') VALOR_FILME_TABELA2
      ,to_char(nvl((select a.vl_produto_pe 
                      from precos_produtos_tabela a
                     where a.CD_PRODUTO = t.CD_PRODUTO
                       and a.dt_inicio_vigencia = (select max(b.dt_inicio_vigencia)
                                                     from precos_produtos_tabela b
                                                    where b.cd_tabela = a.cd_tabela
                                                      and b.cd_produto = t.cd_produto)  
                       and a.cd_tabela = (select tab_temp.cd_tabela 
                                            from (select tmp.cd_tabela, rownum linha 
                                                    from TABELAS_2557 tmp 
                                                   order by 1 asc) tab_temp 
                                                   where tab_temp.linha = 3)),0),'FM999999999990D00') VALOR_NA_TABELA3
      ,to_char(nvl((select a.vl_filme
                      from precos_produtos_tabela a
                     where a.CD_PRODUTO = t.CD_PRODUTO
                       and a.dt_inicio_vigencia = (select max(b.dt_inicio_vigencia)
                                                     from precos_produtos_tabela b
                                                    where b.cd_tabela = a.cd_tabela
                                                      and b.cd_produto = t.cd_produto)  
                       and a.cd_tabela = (select tab_temp.cd_tabela 
                                            from (select tmp.cd_tabela, rownum linha 
                                                    from TABELAS_2557 tmp 
                                                   order by 1 asc) tab_temp 
                                                   where tab_temp.linha = 3)),0),'FM999999999990D00') VALOR_FILME_TABELA3
      ,to_char(nvl((select a.vl_produto_pe 
                      from precos_produtos_tabela a
                     where a.CD_PRODUTO = t.CD_PRODUTO
                       and a.dt_inicio_vigencia = (select max(b.dt_inicio_vigencia)
                                                     from precos_produtos_tabela b
                                                    where b.cd_tabela = a.cd_tabela
                                                      and b.cd_produto = t.cd_produto)  
                       and a.cd_tabela = (select tab_temp.cd_tabela 
                                            from (select tmp.cd_tabela, rownum linha 
                                                    from TABELAS_2557 tmp 
                                                   order by 1 asc) tab_temp 
                                                   where tab_temp.linha = 4)),0),'FM999999999990D00') VALOR_NA_TABELA4
       ,to_char(nvl((select a.vl_filme
                      from precos_produtos_tabela a
                     where a.CD_PRODUTO = t.CD_PRODUTO
                       and a.dt_inicio_vigencia = (select max(b.dt_inicio_vigencia)
                                                     from precos_produtos_tabela b
                                                    where b.cd_tabela = a.cd_tabela
                                                      and b.cd_produto = t.cd_produto)  
                       and a.cd_tabela = (select tab_temp.cd_tabela 
                                            from (select tmp.cd_tabela, rownum linha 
                                                    from TABELAS_2557 tmp 
                                                   order by 1 asc) tab_temp 
                                                   where tab_temp.linha = 4)),0),'FM999999999990D00') VALOR_FILME_TABELA4
       ,to_char(nvl((select a.vl_produto_pe 
                      from precos_produtos_tabela a
                     where a.CD_PRODUTO = t.CD_PRODUTO
                       and a.dt_inicio_vigencia = (select max(b.dt_inicio_vigencia)
                                                     from precos_produtos_tabela b
                                                    where b.cd_tabela = a.cd_tabela
                                                      and b.cd_produto = t.cd_produto)  
                       and a.cd_tabela = (select tab_temp.cd_tabela 
                                            from (select tmp.cd_tabela, rownum linha 
                                                    from TABELAS_2557 tmp 
                                                   order by 1 asc) tab_temp 
                                                   where tab_temp.linha = 5)),0),'FM999999999990D00') VALOR_NA_TABELA5
       ,to_char(nvl((select a.vl_filme
                      from precos_produtos_tabela a
                     where a.CD_PRODUTO = t.CD_PRODUTO
                       and a.dt_inicio_vigencia = (select max(b.dt_inicio_vigencia)
                                                     from precos_produtos_tabela b
                                                    where b.cd_tabela = a.cd_tabela
                                                      and b.cd_produto = t.cd_produto)  
                       and a.cd_tabela = (select tab_temp.cd_tabela 
                                            from (select tmp.cd_tabela, rownum linha 
                                                    from TABELAS_2557 tmp 
                                                   order by 1 asc) tab_temp 
                                                   where tab_temp.linha = 5)),0),'FM999999999990D00') VALOR_FILME_TABELA5
       ,to_char(nvl((select a.vl_produto_pe 
                      from precos_produtos_tabela a
                     where a.CD_PRODUTO = t.CD_PRODUTO
                       and a.dt_inicio_vigencia = (select max(b.dt_inicio_vigencia)
                                                     from precos_produtos_tabela b
                                                    where b.cd_tabela = a.cd_tabela
                                                      and b.cd_produto = t.cd_produto)  
                       and a.cd_tabela = (select tab_temp.cd_tabela 
                                            from (select tmp.cd_tabela, rownum linha 
                                                    from TABELAS_2557 tmp 
                                                   order by 1 asc) tab_temp 
                                                   where tab_temp.linha = 6)),0),'FM999999999990D00') VALOR_NA_TABELA6
       ,to_char(nvl((select a.vl_filme
                      from precos_produtos_tabela a
                     where a.CD_PRODUTO = t.CD_PRODUTO
                       and a.dt_inicio_vigencia = (select max(b.dt_inicio_vigencia)
                                                     from precos_produtos_tabela b
                                                    where b.cd_tabela = a.cd_tabela
                                                      and b.cd_produto = t.cd_produto)  
                       and a.cd_tabela = (select tab_temp.cd_tabela 
                                            from (select tmp.cd_tabela, rownum linha 
                                                    from TABELAS_2557 tmp 
                                                   order by 1 asc) tab_temp 
                                                   where tab_temp.linha = 6)),0),'FM999999999990D00') VALOR_FILME_TABELA6
  from produtos t
 where t.cd_produto in (select z.cd_produto
                          from produtos_2557 z)
   and t.cd_tipo_produto  = 31
 order by t.cd_produto asc  
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante