GARANTIR DESCONTO

Fórum instução sql que pesquisa e soma ao mesmo tempo... #264595

08/01/2005

0

Olá...

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

Balceiro

Responder

Posts

08/01/2005

Brinklley

Não sei se entendi tua pergunta, vou colocar um exemplo parecido para analizar:


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


Responder

Gostei + 0

08/01/2005

Balceiro

Na verdade eu queria fazer algo bem simples como isso:

  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.


Responder

Gostei + 0

10/01/2005

Codex

Tente isso:

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)


Responder

Gostei + 0

10/01/2005

Balceiro

essa sua resposta me fez ficar com uma dúvida...

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 



Responder

Gostei + 0

01/02/2005

Walter Faria

Bom dia .

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 ?


Responder

Gostei + 0

01/02/2005

Martins

Olá... 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?


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
acho q não é o seu caso.

De qualquer forma, desejo-lhe boa sorte!!

Espero ter ajudado.


Responder

Gostei + 0

02/02/2005

Balceiro

olha eu fiquei com uma dúvida e até agora não consegui eliminá-la...

qualk a diferença entre executar um subselect e executar as duas selects separadamente?


existe uma maior performance?


Responder

Gostei + 0

02/02/2005

Paulo_amorim

Olá

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é+


Responder

Gostei + 0

03/02/2005

Aroldo Zanela

Olá 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é+

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)?


Responder

Gostei + 0

03/02/2005

Paulo_amorim

Olá
[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é+


Responder

Gostei + 0

03/02/2005

Aroldo Zanela

Colega,

A recomendação é não utilizar nunca. Eu utilizo raramente, fora de aplicações, apenas para atender eventuais consultas.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar