Select sobre Select, como fazer?

26/12/2005

Olá programadores, boa tarde.

Estou com uma duvida em como devo proceder para poder
efetuar uma consulta em cima de outra.

Por exemplo tenho um ´jogo´ SDS,DSP,CDS,DTS que pesquisa sobre a tabela de notas fiscais emitidas. Agora preciso fazer uma nova pesquisa com o resultado da primeira.

Tem como fazer isso usando o mesmo componete, mas sem perder os dados ja retornados?

Ou preciso de um novo ´jogo´? E caso verdade, como faço a ´ligação´ entre eles.

Agradeço a atenção. :roll:


Macario

Respostas

26/12/2005

Edilcimar

um select com where não serviria? coloque a pesquisa desejada


Responder Citar

26/12/2005

Macario

Primeiro select

 select A.EMP, A.CLI, A.NFI, A.DAT, A.NOP, A.NPE, A.CDPG, A.CDESA,A.DESCICMS, A.IRENDA, A.SERVICOS, B.DESPAG,
C.EFEITOVEN,C.PIS,C.FINSOCIAL, D.V2 as DESCLI, D.V4 as MUNICIPIO, D.V5 as CODEST, D.TCL as CODSEG, 
D.TCL2, D.ZONA ,D.VEN_DIRETA, E.CSG as CODSEG,E.NSG as DESSEG, F.CSG as CODCLA,F.NSG as DESCLA,G.DESZONA,
H.NOMEEST as ESTADO, 
I.NNF, I.NCL, I.NEM, I.QTE, I.VLR, I.QTECE, I.VLRCE, I.PRO, I.IPI, I.PED, I.DNF, I.NRE,I.ICMS, I.ENCPRO, I.ENCIPI,
I.ENCFIN,I.PCO, I.NTIPOCOM,I.NCOMVLRMAS,I.ALI_ICMS,I.PAI,I.PORDEM,I.NDESPADMAS,I.NBONUS,I.IDNF, 
J.V2 as DESREP, K.A2 as DESPRO,K.FATCONV,K.PLIQ,K.GRUPO,K.SGRUPO,K.CODFAB, 
L.DESCRICAO as UNIDADE, (I.QTE*.K.PLIQ) as PESO_PRO 
from ARQNFIS A 
left join ARQCPAG B on (A.CDPG=B.CODPAG) 
left join ARQNOPS C on (A.NOP=C.NOX) 
left join ARQCLIE D on (A.CLI=D.V1) 
left join ARQTCLI E on (D.TCL=E.CSG) 
left join ARQCCLI F on (D.TCL2=F.CSG) 
left join ARQZONA G on (D.ZONA=G.CODZONA) 
left join ARQESTA H on (D.V5=H.CODEST) 
left join ARQPRNF I on (A.NFI=I.NNF) 
left join ARQREPR J on (I.NRE=J.V1) 
left join ARQMER  K on (I.PRO=K.A1) 
left join ARQUNID L on (K.A3=L.COD) 
where A.EMP = ´001´ and D.V0 = ´001´ and I.NEM = ´001´ and 
A.DAT between ´01/07/2005´ and ´31/07/2005´ and 
A.CLI >= ´02238´ and A.CLI <= ´09347´ and 
A.CDPG >= ´´ and A.CDPG <= ´064´ and 
(C.EFEITOVEN = ´S´ or C.EFEITOVEN = ´D´) and A.CDESA = ´N´ and 
D.TCL >= ´01´ and D.TCL <= ´99´ and 
D.TCL2 >= ´01´ and D.TCL2 <= ´99´ and 
D.ZONA>= ´00´ and D.ZONA <= ´99´ and 
I.PRO >= ´002000000000´ and I.PRO <= ´010999999999´ and 
I.NRE >= ´001´ and I.NRE <= ´999´


Do select acima, eu preciso fazer um agrupamento +/- assim



select nfi,dnf,codcli,descli,nop,sum(totpro)as totpro,sum(vlrtot)as vlrtot,sum(icmstot) as icmstot,
sum(pistot)as pistot,sum(cofinstot)as cofinstot,sum(ipi)as ipi,sum(fre)as fre,sUM(VLRTOT) AS LIQUIDO 
from AQUI_PRIMEIRO_SELECT
group by nfi,dnf,codcli,descli,noP



:roll:





P.S: apriveitando, se algum puder me dizer se o primeiro select ta legal ou eu poderia melhora-lo.


Responder Citar

26/12/2005

Eixox

tente fazer isso,

Aqui você usará uma única select para pesquisar vários parâmetros

Select SUM(Campos) from tabela
Where campo = ´SDS´

Select SUM(Outro) from OutraTabela
Where campos = ´DSP´

Tudo num única select.

Era isso que ocê queria?


Responder Citar

27/12/2005

Macario

Ainda não consegui........ :?


Responder Citar

27/12/2005

Aroldo Zanela

Colega,

Use uma View (mais fácil) ou uma subquery com o operador IN.


Responder Citar

27/12/2005

Martins

[quote:5a3b0c5685=´Aroldo Zanela´]Colega,

Use uma View (mais fácil) ou uma subquery com o operador IN.[/quote:5a3b0c5685]Aê [b:5a3b0c5685]Zanela[/b:5a3b0c5685], fazia um tempinho q vc não aparecia por aqui, mandando bem como sempre.


Responder Citar

27/12/2005

Macario

Peço que me desculpem pois não tenho muito conhecimento usando SQL,
porem acho que não fui muito claro.

Citando um exemplo mais simples, digamos que eu faça um select na tabela de clientes onde o filtro inicial seria o estado = SP, a partir dai eu gostaria de fazer outras consultas como por exemplo pegar apenas os clientes com limite de credito > 1000, mas fazendo um select em cima dos registros da primeira consulta: select * from PRIMEIRA_CONSULTA where limite_credito > 1000

É isso que não sei se é possivel fazer ou como devo fazer.


Responder Citar

27/12/2005

Andremuller

vai variar de qual banco de dados vocês está utilizando
se for SQLServer por exemplo é só fazer

SELECT *
FROM
  (
    SELECT * FROM CLIENTE WHERE ESTADO = SP
  )
WHERE
  LIMITECREDITO > 1000



Responder Citar

27/12/2005

Andremuller

OPS!
tem que dar um alias pro result set do from, senão não funciona.
Fica então

SELECT *
FROM
  (
    SELECT * FROM CLIENTE WHERE ESTADO = SP
  ) CONS1
WHERE
  LIMITECREDITO > 1000


Inclusive tu pode referenciar esse CONS1 como se fosse uma tabela, fazendo inner join por exemplo


Responder Citar

04/01/2006

Macario

vai variar de qual banco de dados vocês está utilizando se for SQLServer por exemplo é só fazer
SELECT *
FROM
  (
    SELECT * FROM CLIENTE WHERE ESTADO = SP
  )
WHERE
  LIMITECREDITO > 1000


Olá andremuller.

O banco o SQL 2000.

Bom acho que para o meu ´problema´ não vou ter solução.

Apos efetuar o select acima, eu estou passando os dados para um segundo ClientDataSet, no qual estou usando como tabela temporaria, pois efetuo verificações de parametros usando if que não sei fazer via SQL, pois não tenho muito conhecimento para montar selects mais ´parrudos´.

Então creio que não seja possivel efetuar um select sobre esse temporario.

Estive pensando sobre as tabelas temporarias no proprio SGBD.

O que me indicam?


outra duvida minha
ver link: [url=http://forum.clubedelphi.net/viewtopic.php?t=71940&start=0&postdays=0&postorder=asc&highlight=/]Utilização do metodo ClientDataSet.CreateDataSet?[/url]


Responder Citar

05/01/2006

Andremuller

Pode ser, isso se não ouver outra alternativa. mas o melhor é trazer a menor quantidade de dados possível, o que implica no sql ´parrudo´.

Talvez se tu postar tudo que tu precisa seja possível dar algumas dicas de como montar a busca toda em sql


Responder Citar