Select cláusula SUM sql Firebird
22/04/2021
0
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
Posts
22/04/2021
Emerson Nascimento
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
24/04/2021
Jefferson
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
24/04/2021
Emerson Nascimento
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
Clique aqui para fazer login e interagir na Comunidade :)