Array
(
)

Select sobre Select, como fazer?

Macario
   - 26 dez 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:


Edilcimar
   - 26 dez 2005

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


Macario
   - 26 dez 2005

Primeiro select

#Código


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



#Código
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.


Eixox
   - 26 dez 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?


Macario
   - 27 dez 2005

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


Aroldo Zanela
   - 27 dez 2005

Colega,

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


Martins
   - 27 dez 2005


Citação:
Colega,

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


Macario
   - 27 dez 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.


Andremuller
   - 27 dez 2005

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

#Código

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



Andremuller
   - 27 dez 2005

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

#Código


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


Macario
   - 04 jan 2006


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

#Código

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]


Andremuller
   - 05 jan 2006

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