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
fefisiqueira
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 2
Registrado em: Qui, 02 Jun 2005 8:20 pm
Localização: Guarulhos - SP

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

Selecionar tudo

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:

Selecionar tudo

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.
Avatar do usuário
heraldoaraujo
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 41
Registrado em: Dom, 19 Fev 2012 12:10 pm

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.
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

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

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:

Selecionar tudo


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.
Avatar do usuário
fbifabio
Moderador
Moderador
Mensagens: 199
Registrado em: Ter, 22 Fev 2011 1:51 pm
Localização: São Paulo - SP
Contato:
Fábio Prado
www.fabioprado.net

heraldoaraujo,

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

[]s
Responder
  • Informação
  • Quem está online

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