Select sobre Select, como fazer?

Delphi

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

Macario

Curtidas 0

Respostas

Edilcimar

Edilcimar

26/12/2005

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


GOSTEI 0
Macario

Macario

26/12/2005

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.


GOSTEI 0
Eixox

Eixox

26/12/2005

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?


GOSTEI 0
Macario

Macario

26/12/2005

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


GOSTEI 0
Aroldo Zanela

Aroldo Zanela

26/12/2005

Colega,

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


GOSTEI 0
Martins

Martins

26/12/2005

[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.


GOSTEI 0
Macario

Macario

26/12/2005

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.


GOSTEI 0
Andremuller

Andremuller

26/12/2005

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



GOSTEI 0
Andremuller

Andremuller

26/12/2005

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


GOSTEI 0
Macario

Macario

26/12/2005

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]


GOSTEI 0
Andremuller

Andremuller

26/12/2005

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


GOSTEI 0
POSTAR