Fórum instução sql que pesquisa e soma ao mesmo tempo... #264595
08/01/2005
0
estou desenvolvendo um sistema e em determinado momento preciso mostrar os itens de um pedido e totalizar a qtde e o valor dos itens do pedido. Eu estou fazendo assim:
// realiza uma consulta para mostrar no DBGrid apenas os itens daquele pedido with DM.qItensPedido do begin Close; Sql.Clear; Sql.Add(´Select * from bdItens_Pedido Where Cod_Pedido = ´ + NumPedido); Open; end; with DM.QGeral do begin Close; Sql.Clear; Sql.Add(´SELECT Cod_Pedido, Sum(qtde), Sum(Valor_Total)FROM bdItens_Pedido GROUP BY Cod_Pedido HAVING Cod_Pedido = ´+NumPedido) Open; edNumItens.Text := FieldByName(´expr1001´).AsString; edTotalAcumulado.Text := FieldByName(´expr1002´).AsString; end;
mas gostaria de fazer essas coisas dentro de uma mesma instrução Sql. Teria como fazer isso?
Balceiro
Curtir tópico
+ 0Posts
08/01/2005
Brinklley
select TbTipoCOntainer.DescricaoTipoContainer,
sum(
( SELECT SUM(TBFatura.Valor)
FROM TBCONTAINERSITEMFATURA, TBITENSFATURA, TBFatura
WHERE TBCONTAINERSITEMFATURA.IDCONTAINER = TbContainer.IDCONTAINER
AND TBITENSFATURA.IDITEMFATURA = TBCONTAINERSITEMFATURA.IDITEMFATURA
AND TBFATURA.IDFATURA = TBITENSFATURA.IDFATURA
) -
(( select sum(TBCUSTOSRELACIONADOS.VALOR)
FROM TBCUSTOSRELACIONADOS
WHERE TBCUSTOSRELACIONADOS.IDCONTAINER = TbContainer.IdContainer
) +
( SELECT TBENTRADACONTAINER.VALOR
FROM TBENTRADACONTAINER
WHERE TBENTRADACONTAINER.IDCONTAINER = TbCOntainer.IDCONTAINER
AND TBENTRADACONTAINER.TIPOENTRADA = 1
))
) as lucratividade,
( SELECT SUM(TBFatura.Valor)
FROM TBCONTAINERSITEMFATURA, TBITENSFATURA, TBFatura
WHERE TBCONTAINERSITEMFATURA.IDCONTAINER = TbContainer.IDCONTAINER
AND TBITENSFATURA.IDITEMFATURA = TBCONTAINERSITEMFATURA.IDITEMFATURA
AND TBFATURA.IDFATURA = TBITENSFATURA.IDFATURA
) as receita,
(( select sum(TBCUSTOSRELACIONADOS.VALOR)
FROM TBCUSTOSRELACIONADOS
WHERE TBCUSTOSRELACIONADOS.IDCONTAINER = TbContainer.IdContainer
) +
( SELECT TBENTRADACONTAINER.VALOR
FROM TBENTRADACONTAINER
WHERE TBENTRADACONTAINER.IDCONTAINER = TbCOntainer.IDCONTAINER
AND TBENTRADACONTAINER.TIPOENTRADA = 1
)) as Despesas
from TbContainer, TbTipoContainer
where TbContainer.IdTipoContainer = TbTipoCOntainer.IdTipoContainer
group by TbTipoCOntainer.DescricaoTipoContainer
Faz a soma dos valores por tipo do container mostrando quanto teve de custos e receitas agrupados pelo tipo onde cada tipo tem várias unidades de container,
Aguardo tua resposta ...
Gostei + 0
08/01/2005
Balceiro
with DM.QGeral do begin Close; Sql.Clear; Sql.Add(´SELECT *, Cod_Pedido, Sum(qtde), Sum(Valor_Total)FROM bdItens_Pedido GROUP BY Cod_Pedido HAVING Cod_Pedido = ´+NumPedido) Open; edNumItens.Text := FieldByName(´expr1001´).AsString; edTotalAcumulado.Text := FieldByName(´expr1002´).AsString; end;
mas isso dá erro, por causa do asterisco.
Gostei + 0
10/01/2005
Codex
Select itens1.*, ( Select Sum(itens2.Valor_Total) from bdItens_Pedido itens2 where itens1.Cod_Pedido=itens2.Cod_Pedido ) as total_ped from bdItens_Pedido itens1 Where itens1.Cod_Pedido = 50
É uma tecnica chamada SubQuery, nao deu pra testar, teste se der problemas poste aki ( Vc nao citou o banco de dados presumi que fosse o interbase )
8)
Gostei + 0
10/01/2005
Balceiro
em termso de performance qual a vantagem de eu usar um subselect ao invés de executar as duas select´s cada uma de uma vez?
exemplo:
duas select´s para resolver o problema?
// realiza uma consulta para mostrar no DBGrid apenas os itens daquele pedido with DM.qItensPedido do begin Close; Sql.Clear; Sql.Add(´Select * from bdItens_Pedido Where Cod_Pedido = ´ + NumPedido); Open; end; with DM.QGeral do begin Close; Sql.Clear; Sql.Add(´SELECT Cod_Pedido, Sum(qtde), Sum(Valor_Total)FROM bdItens_Pedido GROUP BY Cod_Pedido HAVING Cod_Pedido = ´+NumPedido) Open; edNumItens.Text := FieldByName(´expr1001´).AsString; edTotalAcumulado.Text := FieldByName(´expr1002´).AsString; end;
[color=red:4e812f2838]ou assim!!! [/color:4e812f2838]
Select itens1.*, ( Select Sum(itens2.Valor_Total) from bdItens_Pedido itens2 where itens1.Cod_Pedido=itens2.Cod_Pedido ) as total_ped from bdItens_Pedido itens1 Where itens1.Cod_Pedido = 50
Gostei + 0
01/02/2005
Walter Faria
Balceiro pegando um gancho na sua questao, estou tentando fazer da mesma forma q vc. Mas fiz a minha SQL assim:
Select itens1.*, (
Select Sum(itens2.Valor_Total) from bdItens_Pedido itens2 where itens1.Cod_Pedido=itens2.Cod_Pedido
) as total_ped
from bdItens_Pedido itens1 Where itens1.Cod_Pedido = 50
pois ela me tras os itens , mas nao soma a coluna ( itens2.Valor_Total )
MInha base de dados é em PARADOS, E USO DELPHI 7. Sera q nao suporta ?
Gostei + 0
01/02/2005
Martins
// realiza uma consulta para mostrar no DBGrid apenas os itens daquele pedido with DM.qItensPedido do begin Close; Sql.Clear; Sql.Add(´Select * from bdItens_Pedido Where Cod_Pedido = ´ + NumPedido); Open; end; with DM.QGeral do begin Close; Sql.Clear; Sql.Add(´SELECT Cod_Pedido, Sum(qtde), Sum(Valor_Total)FROM bdItens_Pedido GROUP BY Cod_Pedido HAVING Cod_Pedido = ´+NumPedido) Open; edNumItens.Text := FieldByName(´expr1001´).AsString; edTotalAcumulado.Text := FieldByName(´expr1002´).AsString; end;
Na primeira intrução passada por vc, vc solicita todos os registros da tabela [b:ab2cc287b8]bdItens_Pedido[/b:ab2cc287b8]
Sql.Add(´Select * from bdItens_Pedido Where Cod_Pedido = ´ + NumPedido);
Na segunda instrução, vc chama apenas os registros q lhe interessam.
Sql.Add(´SELECT Cod_Pedido, Sum(qtde), Sum(Valor_Total)FROM bdItens_Pedido GROUP BY Cod_Pedido HAVING Cod_Pedido = ´+NumPedido)
Sendo assim, vc poderia usa apenas uma única instrução para resolver esse problema.
Select [campos],Sum(campo_x), Sum(Campo_y) from tabela group by campo HAVING campo=(condição)
ou assim
SELECT (SELECT SUM(X) FROM Table2), Y FROM Table1
De qualquer forma, desejo-lhe boa sorte!!
Espero ter ajudado.
Gostei + 0
02/02/2005
Balceiro
qualk a diferença entre executar um subselect e executar as duas selects separadamente?
existe uma maior performance?
Gostei + 0
02/02/2005
Paulo_amorim
Diferença básica: o seu resultado sai num único ResultSet... no seu caso é possível fazer 2 queries porque vc provavelmente usará os dados em casos diferentes, mas nem sempre eh o caso...
Sobre a performance, imagino que uma subselect seja mais rápida à medida que faz somente um acesso ao banco, em uma transação só... não tem que abrir outra transação para pegar o outro ResultSet...
Até+
Gostei + 0
03/02/2005
Aroldo Zanela
Colegas,
Quando se faz o treinamento de tunning de banco de dados, a primeira lição é: Não use subquerys. Isto porque para cada linha recuperada a subquery é executada novamente. Obviamente em certos casos pode ser utilizada sem problemas.
Dependendo do banco de dados, o uso de duas querys será preferível. Qual é o banco de dados? Qual engine (BDE, ADO, IBX, DBX, Zeos)?
Gostei + 0
03/02/2005
Paulo_amorim
[quote:de9310dcaf=´Aroldo Zanela´]Colegas,
Quando se faz o treinamento de tunning de banco de dados, a primeira lição é: Não use subquerys. Isto porque para cada linha recuperada a subquery é executada novamente. Obviamente em certos casos pode ser utilizada sem problemas.[/quote:de9310dcaf]
Se eh assim, perdão pela informação errada. Tinha um pensamento equivocado sobre isso.
Desse modo, quando é ou não recomendável o uso das subqueries?
Até+
Gostei + 0
03/02/2005
Aroldo Zanela
A recomendação é não utilizar nunca. Eu utilizo raramente, fora de aplicações, apenas para atender eventuais consultas.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)