Select vários Selects???

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
ralexsander
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 6
Registrado em: Qua, 23 Nov 2005 10:07 am
Localização: SP

Olá pessoALL, não conheço muito de SQL.... estou tentando recuperar alguns dados para gerar um arquivo fiscal, e não consegui colocar tudo dentro de um select, pois da uns erros devido aos GROUP BY sei lá, então consegui um SELECT pra cada coluna assim:


Selecionar tudo

SELECT distinct nf.documentno, TO_CHAR(nf.dateissued, 'DDMM') AS data FROM compiere.c_notafiscal nf, compiere.c_notafiscalline nfl WHERE nf.documentno > 289 AND nf.documentno < 348 AND nf.c_notafiscal_id = nfl.c_notafiscal_id GROUP BY nf.documentno, nf.dateissued;
SELECT nf.documentno, SUM(nfl.price * nfl.qty) FROM compiere.c_notafiscal nf, compiere.c_notafiscalline nfl WHERE nf.documentno > 289 AND nf.documentno < 348 AND nf.c_notafiscal_id = nfl.c_notafiscal_id GROUP BY nf.documentno;
SELECT nf.documentno, SUM(nfl.price * nfl.qty + (nfl.price * nfl.qty * nfl.rateipi/100)) total FROM compiere.c_notafiscal nf, compiere.c_notafiscalline nfl WHERE nf.documentno > 289 AND nf.documentno < 348 AND nf.c_notafiscal_id = nfl.c_notafiscal_id GROUP BY nf.documentno;
SELECT nf.documentno nf, cfop.name cfop FROM compiere.c_notafiscal nf, compiere.c_cfop cfop WHERE nf.documentno > 289 AND nf.documentno < 348 AND cfop.c_cfop_id = nf.c_cfop_id GROUP BY documentno, cfop.name;
SELECT nf.documentno nf, bp.taxidbr1 cnpj FROM compiere.c_notafiscal nf, compiere.c_bpartner bp WHERE nf.documentno > 289 AND nf.documentno < 348 AND bp.c_bpartner_id = nf.c_bpartner_id GROUP BY documentno, taxidbr1;
SELECT nf.documentno nf, bp.taxidbr2 ie FROM compiere.c_notafiscal nf, compiere.c_bpartner bp WHERE nf.documentno > 289 AND nf.documentno < 348 AND bp.c_bpartner_id = nf.c_bpartner_id GROUP BY documentno, taxidbr2;
SELECT nf.documentno nf, bp.name ie FROM compiere.c_notafiscal nf, compiere.c_bpartner bp WHERE nf.documentno > 289 AND nf.documentno < 348 AND bp.c_bpartner_id = nf.c_bpartner_id GROUP BY documentno, bp.name;
SELECT nf.documentno, SUM(nfl.price * nfl.qty * (1+nfl.rateipi/100)) FROM compiere.c_notafiscal nf, compiere.c_notafiscalline nfl WHERE nf.documentno > 289 AND nf.documentno < 348 AND nf.c_notafiscal_id = nfl.c_notafiscal_id AND nfl.rateipi >= 1 GROUP BY nf.documentno;
SELECT nf.documentno, nfl.rateicms FROM compiere.c_notafiscal nf, compiere.c_notafiscalline nfl WHERE nf.documentno > 289 AND nf.documentno < 348 AND nf.c_notafiscal_id = nfl.c_notafiscal_id GROUP BY nf.documentno, nfl.rateicms;
SELECT nf.documentno, SUM(nfl.rateicms * nfl.price * nfl.qty * (1+nfl.rateipi/100)) FROM compiere.c_notafiscal nf, compiere.c_notafiscalline nfl WHERE nf.documentno > 289 AND nf.documentno < 348 AND nf.c_notafiscal_id = nfl.c_notafiscal_id AND nfl.rateipi > 0 AND nfl.rateicms > 0 GROUP BY nf.documentno;
SELECT nf.documentno, SUM(nfl.price * nfl.qty) valor FROM compiere.c_notafiscal nf, compiere.c_notafiscalline nfl WHERE nf.documentno > 289 AND nf.documentno < 348 AND nf.c_notafiscal_id = nfl.c_notafiscal_id AND nfl.rateicms = 0 GROUP BY nf.documentno;
SELECT nf.documentno, SUM(nfl.price * nfl.qty * (nfl.rateipi/100)) FROM compiere.c_notafiscal nf, compiere.c_notafiscalline nfl WHERE nf.documentno > 289 AND nf.documentno < 348 AND nf.c_notafiscal_id = nfl.c_notafiscal_id GROUP BY nf.documentno;
SELECT nf.documentno, SUM(nfl.price * nfl.qty) icms FROM compiere.c_notafiscal nf, compiere.c_notafiscalline nfl WHERE nf.documentno > 289 AND nf.documentno < 348 AND nf.c_notafiscal_id = nfl.c_notafiscal_id AND nfl.rateipi = 0 GROUP BY nf.documentno;

o que eu quero agora é ajuntar todas as colunas em uma só query, pois cada select tem 2 colunas e uma é em comum pra todos (documentno)... tem como fazer isso???

Obrigado a todos
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Bem, você pode colocar cada um dos seus select na clausula from, daí fazer um OUTER JOIN pelo documentno.

Algo assim;

Selecionar tudo

select
  A.documentno
, x1.data
, x2.preço_qtd
etc....

from 
   (aqui, você coloca um select que retorna todos documentno possíveis para a suas consulta )  A
,  (SELECT distinct nf.documentno, TO_CHAR(nf.dateissued, 'DDMM') AS data FROM compiere.c_notafiscal nf, compiere.c_notafiscalline nfl WHERE nf.documentno > 289 AND nf.documentno < 348 AND nf.c_notafiscal_id = nfl.c_notafiscal_id GROUP BY nf.documentno, nf.dateissued )    X1

,  (SELECT nf.documentno, SUM(nfl.price * nfl.qty) preço_qtd FROM compiere.c_notafiscal nf, compiere.c_notafiscalline nfl WHERE nf.documentno > 289 AND nf.documentno < 348 AND nf.c_notafiscal_id = nfl.c_notafiscal_id GROUP BY nf.documentno  )  X2

,  etc...  
where a.documentno = x1.documentno (+)
  and a.documentno = x2.documentno (+)
etc...
Acho que assim você consegue. Testa aí, tipo, vai incrementando aos poucos a sua tabela pra ver se roda direitinho...
Avatar do usuário
Toad
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 253
Registrado em: Sex, 18 Nov 2005 2:14 pm
Localização: Seattle, WA
Contato:
Matheus Gonçalves
matheus.dev
twitter.com/developer__c

Pessoal, tudo beleza aí???
Bom... tenho a seguinte query, que roda perfeitamente no plus:

Selecionar tudo

select distinct b.cd_disc,
       b.nm_abrev,
       (select sum(QT_QTDTOTAL)
         from f_estat_geral_aproveitamento c
        where c.aa_anomatr||c.ss_semematr = a.aa_anomatr||a.ss_semematr
         and c.id_idtfdisc = b.cd_identdisc) total_de_alunos,
       (select sum(QT_QTDTOTAL)
         from f_estat_geral_aproveitamento c
        where c.aa_anomatr||c.ss_semematr = a.aa_anomatr||a.ss_semematr
         and c.id_idtfdisc = b.cd_identdisc
         and c.cd_condaprv not in ('AP','SA')) Total_de_reprovados,
    trunc(((select sum(QT_QTDTOTAL)
         from f_estat_geral_aproveitamento c
        where c.aa_anomatr||c.ss_semematr = a.aa_anomatr||a.ss_semematr
         and c.id_idtfdisc = b.cd_identdisc
         and c.cd_condaprv not in ('AP','SA'))
         /
        (select sum(QT_QTDTOTAL)
         from f_estat_geral_aproveitamento c
        where c.aa_anomatr||c.ss_semematr = a.aa_anomatr||a.ss_semematr
         and c.id_idtfdisc = b.cd_identdisc))*100,2) Perc_de_reprovados
  from f_estat_geral_aproveitamento a,f_departamento d,
       f_disciplina b
 where a.aa_anomatr||a.ss_semematr = 20052
   and a.id_idtfdisc = b.cd_identdisc
   and d.cd_dept = 'CI'
   and a.cd_dept = d.cd_dept

order by b.cd_disc
Mas assim que eu passo pro Pl/SQL do Forms, dá erro e não faz a consulta.
O que estou fazendo de errado?
Abraços!
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

dá qual erro ?
Avatar do usuário
Toad
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 253
Registrado em: Sex, 18 Nov 2005 2:14 pm
Localização: Seattle, WA
Contato:
Matheus Gonçalves
matheus.dev
twitter.com/developer__c

Dá um erro logo no select do terceiro parâmetro..
Aqui, ó:

Selecionar tudo

select distinct b.cd_disc,
       b.nm_abrev,
       (select sum(QT_QTDTOTAL) -- Erro nesse select...
Abraços!
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

qual erro? qual versão do forms ? qual versão do banco ?
Tudo isso faz diferença, pois o PL/SQL do forms é diferente do PL/SQL do banco.

Veja isso:

Selecionar tudo

SQL> select * from v$version;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 - Prod
PL/SQL Release 10.1.0.2.0 - Production
CORE    10.1.0.2.0      Production
TNS for Linux: Version 10.1.0.2.0 - Production
NLSRTL Version 10.1.0.2.0 - Production

SQL> 
Estou usando a versão 10.1.0.2.0 para o PL/SQL no banco.
E no forms, fui lã no "About" e vi que a versão do meu PL/SQL do forms é PL/SQL Version 8.0.6.0.0 (Production).

É uma grande diferença!
A maioria das coisas funciona, mas as features NOVAS talvez não.

Eu já tive um caso que o PL/SQL do forms não aceitava de jeito nenhum um ORDER BY no fim de um select bem complexo. No SQL*Plus e nas packages de banco, funcionava perfeitamente...

Provavelmente, este é o seu caso aí...
:-o
Editado pela última vez por dr_gori em Qua, 22 Fev 2006 5:31 pm, em um total de 1 vez.
Avatar do usuário
Toad
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 253
Registrado em: Sex, 18 Nov 2005 2:14 pm
Localização: Seattle, WA
Contato:
Matheus Gonçalves
matheus.dev
twitter.com/developer__c

Pootz...agora você me deixou com medo...
Banco 10g
Foms :oops:


4.5
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Estou com pena de você TOAD.. hehehe
deve ser isso que eu citei acima.
Avatar do usuário
Toad
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 253
Registrado em: Sex, 18 Nov 2005 2:14 pm
Localização: Seattle, WA
Contato:
Matheus Gonçalves
matheus.dev
twitter.com/developer__c

Pois é Dr... imagina cada dragão que eu não tenho que matar nesse Forms... imagina a ferramenta que você tem e que eu tenho que "fazer"... :cry:
Bom... a pergunta que eu faço é: E agora!?? Como eu posso fazer que essa Query me retorne os valores. Pelo que eu entendi, ele não aceita subquery como parâmetro...
Alguma idéia!?
Abraços!
E brigadão mais uma vez!!
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Uma idéia é você criar uma VIEW no banco. Daí você pode acessar essa consulta como se fosse uma tabela.

:-o
Avatar do usuário
Toad
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 253
Registrado em: Sex, 18 Nov 2005 2:14 pm
Localização: Seattle, WA
Contato:
Matheus Gonçalves
matheus.dev
twitter.com/developer__c

É Dr... Fiz uma rotina que funcionou....
Fiz um cursor geral... e com um for nele, trazia os dados baseados num parâmetro...
Ficou assim:

Selecionar tudo

DECLARE

 cursor X is
 SELECT distinct
      (b.cd_identdisc) B_IDENTIDISC,b.cd_disc,
      (b.cd_disc||'#'||b.nm_abrev||'#' ) linha
  FROM  f_estat_geral_aproveitamento a,
       f_Disciplina b, 
       f_departamento d
 WHERE to_char(a.aa_anomatr)||to_char(a.ss_semematr) = :TXT_ANO||:TXT_SEM
   AND a.id_idtfdisc = b.cd_identdisc 
   AND a.cd_dept = :CD_DEPT
   AND a.cd_dept = d.cd_dept
   order by b.cd_disc;

 CURSOR TOTAL_ALUNO(p_identdisc f_disciplina.cd_identdisc%Type) IS
 select sum(c.QT_QTDTOTAL)
       from f_estat_geral_aproveitamento c,f_departamento d,
       f_disciplina b
       where to_char(c.aa_anomatr)||to_char(c.ss_semematr) = :TXT_ANO||:TXT_SEM
       and c.id_idtfdisc = b.cd_identdisc
       and d.cd_dept = :CD_DEPT
       and c.cd_dept = d.cd_dept
       and b.cd_identdisc = p_identdisc;

 CURSOR REPROVADOS(p_identdisc f_disciplina.cd_identdisc%Type) IS
 select sum(QT_QTDTOTAL)
         from f_estat_geral_aproveitamento c,f_departamento d,
         f_disciplina b
        where to_char(c.aa_anomatr)||to_char(c.ss_semematr) = :TXT_ANO||:TXT_SEM
         and c.id_idtfdisc = b.cd_identdisc
         and c.cd_condaprv not in ('AP','SA')
         and d.cd_dept = :CD_DEPT
         and c.cd_dept = d.cd_dept
         and b.cd_identdisc = p_identdisc;
        

  v_texto_linha varchar2(250);
  v_total_alunos number;
  v_total_REPROVA number;
  v_PERC_REPROVA number;
  meuarquivo text_io.file_type;
  
  begin
   
   if  :cd_dept is null or :txt_ano is null or :txt_sem is null then
    mensagem('Todos os dados devem ser preenchidos!!', true);
   end if;
   
   if  :TXT_SEM NOT IN ('1','2') then
    mensagem('Semestre deve ser apenas 1 ou 2!!', true);
   end if;
   
   if  (to_date(:TXT_ANO,'yyyy') > round(sysdate,'yyyy')) or length(:TXT_ANO)<4 then
    mensagem('Ano deve ser menor ou igual ao atual!!', true);
   end if;

    set_application_property(cursor_style,'busy');
    meuarquivo := text_io.fopen('c:\temp\'||:NM_DEPT||' - '||:TXT_SEM||:TXT_ANO||'.txt','W');
 
    for r in x loop
            
       
       open TOTAL_ALUNO(r.B_IDENTIDISC);
       fetch TOTAL_ALUNO into v_total_alunos;
       close Total_aluno;
     
       open REPROVADOS(r.B_IDENTIDISC);
       fetch REPROVADOS into v_total_REPROVA;
       close REPROVADOS;
       
       IF v_total_REPROVA is null THEN

          v_total_REPROVA := 0;

       END IF;


       v_PERC_REPROVA := TRUNC((v_total_REPROVA/v_total_alunos)*100,2);
       

       v_texto_linha := r.linha ||to_char(v_total_alunos)||'#';
       V_TEXTO_LINHA := V_TEXTO_LINHA ||to_char(v_total_REPROVA)||'#';
       V_TEXTO_LINHA := V_TEXTO_LINHA || to_char(v_PERC_REPROVA)||'%';
       text_io.put_line(meuarquivo,v_texto_linha);

    end loop;
    set_application_property(cursor_style,'default');
    text_io.fclose(meuarquivo);
    mensagem('Texto Gerado !!');
  
   exception
    when others then
      set_application_property(cursor_style,'default');
      text_io.fclose(meuarquivo);
      mensagem('Erro ao criar o arquivo !!',true);
  
end;
Fica aí...se ajudar alguém, está ótimo!

Abraços!

Toad
Responder
  • Informação