Select sobre Select, como fazer?
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:
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
Curtidas 0
Respostas
Edilcimar
26/12/2005
um select com where não serviria? coloque a pesquisa desejada
GOSTEI 0
Macario
26/12/2005
Primeiro select
Do select acima, eu preciso fazer um agrupamento +/- assim
:roll:
P.S: apriveitando, se algum puder me dizer se o primeiro select ta legal ou eu poderia melhora-lo.
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
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?
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
26/12/2005
Ainda não consegui........ :?
GOSTEI 0
Aroldo Zanela
26/12/2005
Colega,
Use uma View (mais fácil) ou uma subquery com o operador IN.
Use uma View (mais fácil) ou uma subquery com o operador IN.
GOSTEI 0
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.
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
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.
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
26/12/2005
vai variar de qual banco de dados vocês está utilizando
se for SQLServer por exemplo é só fazer
se for SQLServer por exemplo é só fazer
SELECT * FROM ( SELECT * FROM CLIENTE WHERE ESTADO = SP ) WHERE LIMITECREDITO > 1000
GOSTEI 0
Andremuller
26/12/2005
OPS!
tem que dar um alias pro result set do from, senão não funciona.
Fica então
Inclusive tu pode referenciar esse CONS1 como se fosse uma tabela, fazendo inner join por exemplo
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
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
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
Talvez se tu postar tudo que tu precisa seja possível dar algumas dicas de como montar a busca toda em sql
GOSTEI 0