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
  

Mensagemem Qua, 23 Nov 2005 10:09 am

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:



Código: Selecionar todos
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
ralexsander
Localização: SP

Mensagemem Qua, 23 Nov 2005 10:24 am

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

Algo assim;

Código: Selecionar todos
select
  A.documentno
, x1.data
, x2.preco_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) preco_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...
dr_gori
Localização: Portland, OR USA

Thomas F. G

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

Mensagemem Qua, 22 Fev 2006 4:35 pm

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

Código: Selecionar todos
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!
Toad
Localização: Seattle, WA

Matheus H. Gonçalves
www.toad.com.br
www.twitter.com/toadgeek

Mensagemem Qua, 22 Fev 2006 5:09 pm

dá qual erro ?
dr_gori
Localização: Portland, OR USA

Thomas F. G

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

Mensagemem Qua, 22 Fev 2006 5:12 pm

Dá um erro logo no select do terceiro parâmetro..
Aqui, ó:
Código: Selecionar todos
select distinct b.cd_disc,
       b.nm_abrev,
       (select sum(QT_QTDTOTAL) -- Erro nesse select...

Abraços!
Toad
Localização: Seattle, WA

Matheus H. Gonçalves
www.toad.com.br
www.twitter.com/toadgeek

Mensagemem Qua, 22 Fev 2006 5:19 pm

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:
Código: Selecionar todos
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.
dr_gori
Localização: Portland, OR USA

Thomas F. G

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

Mensagemem Qua, 22 Fev 2006 5:29 pm

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


4.5
Toad
Localização: Seattle, WA

Matheus H. Gonçalves
www.toad.com.br
www.twitter.com/toadgeek

Mensagemem Qua, 22 Fev 2006 5:30 pm

Estou com pena de você TOAD.. hehehe
deve ser isso que eu citei acima.
dr_gori
Localização: Portland, OR USA

Thomas F. G

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

Mensagemem Qua, 22 Fev 2006 5:40 pm

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!!
Toad
Localização: Seattle, WA

Matheus H. Gonçalves
www.toad.com.br
www.twitter.com/toadgeek

Mensagemem Qua, 22 Fev 2006 5:59 pm

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

:-o
dr_gori
Localização: Portland, OR USA

Thomas F. G

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

Mensagemem Sex, 24 Fev 2006 11:22 am

É Dr... Fiz uma rotina que funcionou....
Fiz um cursor geral... e com um for nele, trazia os dados baseados num parâmetro...
Ficou assim:
Código: Selecionar todos
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
Toad
Localização: Seattle, WA

Matheus H. Gonçalves
www.toad.com.br
www.twitter.com/toadgeek


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


Voltar para PL/SQL

Quem está online

Usuários navegando neste fórum: Google [Bot] e 4 visitantes