Select cláusula SUM sql Firebird

SQL

Delphi

IBExpert

Firebird

22/04/2021

Olá Bom Dia!

Galera tenho duas tabelas filhos de origem estrangeira (VENDA_ITEM, VENDA_SERVICO).
Quero realizar um select somando os valores totais dessas duas tabelas. No momento tenho o sequinte sql:

SELECT V.NUMERO,
COALESCE(SUM(V.TOTAL + S.TOTAL),0) AS TOTAL
FROM VENDA_ITEM V
INNER JOIN VENDA_SERVICO S ON S.NUMERO = V.NUMERO GROUP BY V.NUMERO;

O problema é que se alguma das duas tabelas conter mais de 1 registro, o resultado do select me traz um valor de origem desconhecida, como se estivesse multiplicando ao invés de somar.


Helpppp...
Jefferson

Jefferson

Curtidas 0

Respostas

Emerson Nascimento

Emerson Nascimento

22/04/2021

tente
SELECT
   V.NUMERO,
   COALESCE(VI.TOTAL,0) ITENS,
   COALESCE(VS.TOTAL,0) AS SERVICOS,
   COALESCE(VI.TOTAL,0) + COALESCE(VS.TOTAL,0) AS TOTAL
FROM
  VENDA V
LEFT JOIN
   (SELECT NUMERO, SUM(TOTAL) TOTAL
    FROM VENDA_ITEM
    GROUP BY NUMERO) VI ON VI.NUMERO = V.NUMERO 
LEFT JOIN
   (SELECT NUMERO, SUM(TOTAL) TOTAL
    FROM VENDA_SERVICO
    GROUP BY NUMERO) VS ON VS.NUMERO = V.NUMERO 
[WHERE
   V.xxx] -- where opcional

ou
SELECT
   V.NUMERO,

   COALESCE((SELECT SUM(VI.TOTAL) FROM VENDA_ITEM VI
            WHERE VI.NUMERO = V.NUMERO),0) ITENS,

   COALESCE((SELECT NUMERO, SUM(TOTAL) FROM VENDA_SERVICO VS
            WHERE VS.NUMERO = V.NUMERO),0) SERVICOS

FROM
  VENDA V
[WHERE
   V.xxx] -- where opcional


o que for mais performático
GOSTEI 0
Jefferson

Jefferson

22/04/2021

Olá amigo! Boa Noite!

Tive a seguinte mensagem de erro, realizei algumas modificações onde creio que era necessário ser feito. Se estiver incorreto me corrija por favor!!

SELECT
V.id,

COALESCE((SELECT SUM(VP.vlr_total) FROM VENDA_ORC_PROD VP
WHERE VI.ID_VENDA = V.ID),0) ITENS,

COALESCE((SELECT ID_VENDA, SUM(VLR_TOTAL) FROM VENDA_ORC_SERVICO VS
WHERE VS.id_venda = V.id),0) SERVICOS

FROM
VENDA_ORC V
WHERE
V.id = VI.ID_VENDA AND V.id = VS.id_venda;


ERRO: Column does not belong to referenced table.
Dynamic SQL Error.
SQL error code = -206.
Column unknown.
VI.ID_VENDA.
unknown ISC error 336397208.







Estruturas das minhas tabelas:


Tabela Venda, Orçamento:

CREATE GENERATOR GEN_VENDA_ORC_ID;

CREATE TABLE VENDA_ORC (
ID INTEGER NOT NULL, //CHAVE PRIMARIA
TIPO VARCHAR(3),
DATA_VENDA TIMESTAMP,
ID_CLIENTE INTEGER NOT NULL,
NOME_CLIENTE VARCHAR(65),
OBS_CLIENTE VARCHAR(25),
ID_FUNC INTEGER NOT NULL,
NOME_FUNC VARCHAR(40),
SUBTOTAL DECIMAL(12,2),
PERC_DESCONTO DECIMAL(12,2),
DESCONTO DECIMAL(12,2),
TOTAL DECIMAL(12,2),
STATUS VARCHAR(10),
OBS_GERAIS VARCHAR(200)
);


Tabela Item(Produto):

CREATE GENERATOR GEN_VENDA_ORC_PROD_ID;

CREATE TABLE VENDA_ORC_PROD (
ID_VENDA INTEGER NOT NULL, //CHAVE ESTRAGEIRA
COD_PROD INTEGER NOT NULL, //CHAVE PRIMARIA
ITEM_ORC INTEGER,
DESCRICAO VARCHAR(70),
UND_VENDA VARCHAR(3),
QTD DECIMAL(12,2),
VLR_UNITARIO DECIMAL(12,2),
PERC_DESC_PROD DECIMAL(12,2),
DESC_PROD DECIMAL(12,2),
VLR_CUSTO_PROD DECIMAL(12,2),
VLR_TOTAL DECIMAL(12,2)
);

Tabela Serviço:

CREATE TABLE VENDA_ORC_SERVICO (
ID_VENDA INTEGER, //CHAVE ESTRANGEIRA
COD_SERVICO INTEGER, // CHAVE PRIMARIA
DESCRICAO VARCHAR(100),
PERC_DESC_SERVICO DECIMAL(12,2),
DESC_SERVICO DECIMAL(12,2),
VLR_CUSTO_SERVICO DECIMAL(12,2),
VLR_TOTAL DECIMAL(12,2)
);



No meu formulário tenho 3 DbEdit ligada as seguintes colunas da tabela Venda:

SUBTOTAL DECIMAL(12,2),
PERC_DESCONTO DECIMAL(12,2),
DESCONTO DECIMAL(12,2),
TOTAL DECIMAL(12,2);

Sempre que as query das tabelas Item e serviço recebem o comando post, será realizado o select nas ambas tabelas somando o valor total.



Exemplo:

begin
if MessageBox(Handle,'Confirmar serviço?','Sistema Unilite', MB_YESNO or MB_ICONQUESTION) = mrYes then
begin
IdVenda := StrToInt(FDQryVendaOrc.FieldByName('ID').AsString);
FDQrysServicoVendaOrc.Post;
FDQryServico.Close;
DBEditPerDescServico.DataField := '';
DBEditDescServico.DataField := '';
DBEditVlrServico.DataField := '';
FDQryCalVenda.Close;
FDQryCalVenda.SQL.Clear;
FDQryCalVenda.SQL.ADD('SELECT SUM(P.VLR_CUSTO_PROD + S.VLR_CUSTO_SERVICO) AS VLR_TOTAL_BRUTO_CALC, SUM(P.PERC_DESC_PROD + S.PERC_DESC_SERVICO) AS PERC_DESC_PROD_CALC, SUM(P.DESC_PROD + S.DESC_SERVICO)');
FDQryCalVenda.SQL.ADD('AS DESC_PROD_CALC, SUM(P.VLR_TOTAL + S.VLR_TOTAL) AS VLR_TOTAL_CALC FROM VENDA_ORC_PROD P, VENDA_ORC_SERVICO S WHERE P.ID_VENDA = '+ IntToStr(IdVenda)+' AND S.ID_VENDA = '+ IntToStr(IdVenda)+';');
FDQryCalVenda.Open;
FDQryVendaOrc.FieldByName('SUBTOTAL').AsFloat := FDQryCalVenda.Fields[0].AsFloat;
FDQryVendaOrc.FieldByName('PERC_DESCONTO').AsFloat := FDQryCalVenda.Fields[1].AsFloat;
FDQryVendaOrc.FieldByName('DESCONTO').AsFloat := FDQryCalVenda.Fields[2].AsFloat;
FDQryVendaOrc.FieldByName('TOTAL').AsFloat := FDQryCalVenda.Fields[3].AsFloat;
UnitDataModule.DMUnilite.FDUniLite.Commit;
BitBtnFormPag.Enabled := true;
end
else
begin
FDQrysServicoVendaOrc.Cancel;
end;
end
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

22/04/2021

SELECT

	V.id,

	COALESCE((SELECT SUM(VP.vlr_total) FROM VENDA_ORC_PROD VP
	WHERE VP.ID_VENDA = V.ID),0) ITENS,

	COALESCE((SELECT SUM(VS.vlr_total) FROM VENDA_ORC_SERVICO VS
	WHERE VS.id_venda = V.id),0) SERVICOS

FROM
	VENDA_ORC V

OU
SELECT

	V.id,

	COALESCE(VI.TOTAL,0) ITENS,
	COALESCE(VS.TOTAL,0) SERVICOS

FROM
	VENDA_ORC V

LEFT JOIN
	(SELECT ID_VENDA, SUM(vlr_total) TOTAL FROM VENDA_ORC_PROD
	GROUP BY ID_VENDA) VI ON VI.ID_VENDA = V.ID

LEFT JOIN
	(SELECT ID_VENDA, SUM(vlr_total) TOTAL FROM VENDA_ORC_SERVICO
	GROUP BY ID_VENDA) VS ON VS.ID_VENDA = V.ID
GOSTEI 0
Jefferson

Jefferson

22/04/2021

Obrigado Amigo!!!
GOSTEI 0
POSTAR