Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Ricardo Santana

select em vários selects????

Recommended Posts

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:

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se os selects tem o mesmo número de colunas e tipos na mesmo ordem faça um union

 

 

Select ....

Group by .....

union

Select ....

Group by .....

Compartilhar este post


Link para o post
Compartilhar em outros sites

Caso você esteja utilizando uma versão 9i ou superior, que tal utilizar o INNER JOIN!

 

E caso suas tabelas também tenham ALGUM campo em comun para fazer um relacionamento.

 

SELECT A.COLUNA, B.COLUNA, C.COLUNA, C.COLUNA2

FROM TABELA A

INNER JOIN TABELA2 B ON A.CAMPO=B.CAMPO

WHERE A.COLUNA = 'R' AND B.COLUNA > 34 e etc ....

 

 

Abraços, http://forum.imasters.com.br/public/style_emoticons/default/shifty.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Quase funcionou com o INNER JOIN, o código ficou assim:

/* Formatted on 2005/11/23 16:55 (Formatter Plus v4.8.7) */SELECT a.nota, a.data_emissao, b.base_ipi, c.valor_contabil, d.codigo_fiscal, e.cgc, f.ie, k.isento_icms, l.imposto_ipi, m.isento_ipi FROM (SELECT nf.documentno nota, TO_CHAR (nf.dateissued, 'DDMM') AS data_emissao 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) a INNER JOIN (SELECT nf.documentno nota, SUM (nfl.price * nfl.qty) base_ipi 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) b ON a.nota = b.nota INNER JOIN (SELECT nf.documentno nota, SUM ( nfl.price * nfl.qty + (nfl.price * nfl.qty * nfl.rateipi / 100) ) valor_contabil 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) c ON b.nota = c.nota INNER JOIN (SELECT nf.documentno nota, cfop.NAME codigo_fiscal 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) d ON c.nota = d.nota INNER JOIN (SELECT nf.documentno nota, bp.taxidbr1 cgc 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) e ON d.nota = e.nota INNER JOIN (SELECT nf.documentno nota, 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) f ON e.nota = f.nota INNER JOIN (SELECT nf.documentno nota, SUM (nfl.price * nfl.qty) isento_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.rateicms = 0 GROUP BY nf.documentno) k ON f.nota = k.nota INNER JOIN (SELECT nf.documentno nota, SUM (nfl.price * nfl.qty * (nfl.rateipi / 100)) imposto_ipi 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) l ON k.nota = l.nota INNER JOIN (SELECT nf.documentno nota, SUM (nfl.price * nfl.qty) isento_ipi 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) m ON l.nota = m.nota ;

Nesse caso ta funcionando bem, o problema é que tem mais 4 selects que eu removi pra e funcionar, pois esses 4 selects não retornam os 58 registros, retornam menos, apenas 40 ou 20, ai eu não remover essa regra o INNER JOIN não funciona direito, pois ele não me retorna nenhum registro.... ou tentei usar o OUTER JOIN mas não consegui usa-lo...é possível usar IF dentro dos Selects??? alguém já usou o OUTER JOIN ???

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho q seria mais fácil você utilizar alguma linguagem (php, asp, vb, etc) para juntar os dados realizando as selects e organizando da forma que você deseja. No final, as selects ficarão mais simples e você nao precisará quebrar tanto a cabeça.[]´sSim, é possível usar IF, IFNULL, e CASE dentro das selectsEx: select if(coluna1 > coluna2, 1, 0) from orders. Onde se a coluna1 tiver valor 2 e coluna2 tiver valor 1, essa instrução retornaria 1 (segundo argumento). Se a coluna1 tiver um valor menor que a coluna2, então retornará 0 (3º argumento).[]´s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se você conseguir entender a REGRA DE NEGOCIO, você consegue montar tudo num SELECT(ZÃO) ou bloco PL/SQl para te auxiliar no tratamento dos dados. Abraços, :natalsmile:

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.