Dúvida para montar Query com valores que se repetem

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
  

Mensagemem Qua, 01 Mar 2006 9:24 pm

Pessoal, :wink:
Olá, eu tenho a seguinte Query, onde estou tendo um probleminha:

Código: Selecionar todos
select DU7.DU7_FILDOC FILIAL,
       DU7.DU7_DOC CTRC,
       TO_DATE(DT6.DT6_DATEMI,'YYYYMMDD') EMISSAO,
       DTC.DTC_NUMNFC NF,
       DTC.DTC_VALOR VR_MERC,
       (select Z04.Z04_VLRCTN from Z04010 Z04
                where DTC.DTC_CODEMB = Z04.Z04_CODEMB
                  AND Z04.Z04_FILIAL= '  '
                  AND Z04.D_E_L_E_T_ = ' ') VR_CTN
  from DU7010 DU7,
       DT6010 DT6,
       DTC010 DTC
where DU7.DU7_FILIAL = DT6.DT6_FILIAL
   AND DU7.DU7_FILDOC = DT6.DT6_FILDOC
   AND DU7.DU7_DOC    = DT6.DT6_DOC
   AND DU7.DU7_SERIE  = DT6.DT6_SERIE
   AND DT6.DT6_FILIAL = DTC.DTC_FILIAL
   AND DT6.DT6_FILORI = DTC.DTC_FILORI
   AND DT6.DT6_LOTNFC = DTC.DTC_LOTNFC
   AND DU7.D_E_L_E_T_ = '  '
   AND DT6.D_E_L_E_T_ = '  '
   AND DTC.D_E_L_E_T_ = '  '
   AND DT6.DT6_FILIAL = '  '
   AND DU7.DU7_FILIAL = '  '
   AND DTC.DTC_FILIAL = '  '   
   AND DT6.DT6_DOC = '150699'
   AND DT6.DT6_DATEMI >= '20060201' AND DT6.DT6_DATEMI <='20060228'
   AND DU7_COMSEG='01' --01=RCTR-C 02=RCF-DC
   AND DU7_CLIAVB<>'      ' --seguro cliente
   ORDER BY DU7_DOC


Quando eu a executo ela traz os seguintes dados:

Código: Selecionar todos
FILIAL   CTRC   EMISSAO   NF   VR_MERC   VR_CTN
54   150699   22/2/2006   1735   10212,51   12000
54   150699   22/2/2006   1736   9915,78   12000
54   150699   22/2/2006   1737   2259,97   12000
54   150699   22/2/2006   1738   3085,23   12000
54   150699   22/2/2006   1739   2782,92   12000
54   150699   22/2/2006   1740   1775,77   12000
54   150699   22/2/2006   1741   1242,47   12000
54   150699   22/2/2006   1742   1048,58   12000
54   150699   22/2/2006   1743   1603,92   12000
54   150699   22/2/2006   1744   20917,32   12000
54   150699   22/2/2006   1745   4398,11   12000
54   150699   22/2/2006   1746   34509,24   12000


O problema é que a coluna CTRC tem 12 NF's com valores de Mercadoria diferentes, mas O VR_MERC é 12000 para o CTRC 150699.
Eu gostaria de trazer os 12000 somente na primeira NF, ou na última NF, mas não consigo, pois o valor é único para as 12 NF's desse CTRC 150699.
Detalhe, existem documentos que não tem esse valor, e por isso que fiz uma subselect referente à tabela Z04010, pois as que não tem, retorna como branco.

Alguém sabe como fazer isso?
Obrigada.
Fernanda.
fefisiqueira
Localização: Guarulhos - SP

Mensagemem Ter, 16 Out 2012 10:59 am

Usa função de grupo "group by" nos campos que você quer unir como por exemplo no seu caso da coluna CTRC. Mas como você tem outros campos de valor e data entre outros terá que declarar na função de group by ou funçao de valor MAX(data), MAX(valor), SUM(valor) isso para todas as colunas que deseja exibir na sua query.
heraldoaraujo

Mensagemem Ter, 16 Out 2012 11:25 am

Brother,

Talvez dê para se utilizar também as funções analíticas o Oracle.

Mas, se for isso q precisa, fiz um exemplo aqui apenas para que os demais foristas consiga nos ajudar:

Código: Selecionar todos

create table teste (filial number(07), ctrc number(07), emissao date, nf varchar2(10),
                    vr_merc number(10,2), vr_ctn number (10,2)  );
                   

insert into teste values (54, 150699,   '22/2/2006',   '1735',   10212.51,  12000);
insert into teste values (54, 150699,   '22/2/2006',   '1736',   9915.78,   12000);
insert into teste values (54, 150699,   '22/2/2006',   '1737',   2259.97,   12000);
insert into teste values (54, 150699,   '22/2/2006',   '1738',   3085.23,   12000);
insert into teste values (54, 150699,   '22/2/2006',   '1739',   2782.92,   12000);
insert into teste values (54, 150699,   '22/2/2006',   '1740',   1775.77,   12000);

insert into teste values (54, 150700,   '22/2/2006',   '1741',   1775.77,   11000);
insert into teste values (54, 150700,   '22/2/2006',   '1742',   1776.77,   11000);
insert into teste values (54, 150700,   '22/2/2006',   '1743',   1777.77,   11000);
insert into teste values (54, 150700,   '22/2/2006',   '1744',   1778.77,   11000);

insert into teste values (54, 150701,   '22/2/2006',   '1745',   1775.77,   1000);
insert into teste values (54, 150701,   '22/2/2006',   '1746',   1776.77,   1000);
insert into teste values (54, 150701,   '22/2/2006',   '1747',   1777.77,   1000);
insert into teste values (54, 150701,   '22/2/2006',   '1748',   1778.77,   1000);


select t2.filial,
       t2.ctrc,
       t2.emissao,
       t2.nf,
       t2.vr_merc,
       (select t1.vr_ctn
          from teste t1
         where t1.ctrc = t2.ctrc
           and t1.nf = t2.nf
           and t1.nf = (select min(t3.nf)
                          from teste t3
                         where t3.ctrc = t2.ctrc))
  from teste t2;


Qualquer coisa, manda pra gente.
Trevisolli
Localização: Araraquara - SP

Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Mensagemem Sex, 14 Jun 2013 9:19 am

heraldoaraujo,

Dá para obter o resultado que você está procurando através da função analítica LISTAGG (somente 11G)!

[]s
fbifabio
Localização: São Paulo - SP

Fábio Prado
www.fabioprado.net


  • Veja também
    Respostas
    ExibiÇões
    Última mensagem


      Voltar para SQL

      Quem está online

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