 |
ActiveDelphi .: O site do programador Delphi! :.
|
Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Qua Abr 03, 2019 1:20 pm Assunto: Erro na soma sql firebird 2.5? |
|
|
Se eu fizer sql assim
Código: | SELECT vi.quantidade,
vi.nome_pedido,
SUM( QUANTIDADE ),
SUM( PRECO_TOTAL_DESC_AJUST ),
SUM( VALOR_RATEIO_TITULAR ),
SUM( VALOR_RATEIO_ASSISTENTE ),
SUM( CUSTO_COM_AQUISICAO ),
SUM( CUSTO_COM_PRODUTOS_TOTAL ),
SUM( CUSTO_OPERACIONAL ),
sum((select sum(vp.valor_parcela) from vendas_pagamento vp where vp.codigo = v.codigo and vp.anulado is null))
FROM VENDAS_ITENS VI, VENDAS V
WHERE V.CODIGO = VI.CODIGO AND
V.DATA_HORA BETWEEN :DATA_INI AND :DATA_FIN AND
VI.CODIGO_TITULAR = :COD_PROFISSIONAL AND
VI.CODIGO_PEDIDO = :COD_PEDIDO AND
VI.TIPO_PEDIDO = :TIPO AND
VI.ITEM_CANCELADO = 'Nao' AND
VI.TIPO IS NULL
group by 1, 2 |
Meu resultado de soma é
Citação: | SUM = 27
SUM1 = 486,000
SUM4 = 480,500
SUM7 = 3.103,000
|
Se eu mudo assim
Código: | SELECT vi.quantidade,
vi.nome_pedido,
SUM( QUANTIDADE ),
SUM( PRECO_TOTAL_DESC_AJUST ),
SUM( VALOR_RATEIO_TITULAR ),
SUM( VALOR_RATEIO_ASSISTENTE ),
SUM( CUSTO_COM_AQUISICAO ),
SUM( CUSTO_COM_PRODUTOS_TOTAL ),
SUM( CUSTO_OPERACIONAL ),
sum((select sum(vp.valor_parcela) from vendas_pagamento vp where vp.codigo = v.codigo and vp.anulado is null))
FROM VENDAS_ITENS VI
INNER JOIN VENDAS V ON V.CODIGO = VI.CODIGO
INNER JOIN vendas_pagamento vp ON vp.codigo = v.codigo
AND vp.anulado is null
INNER JOIN FORMAS_PAGAMENTO fp ON vp.forma_pagamento = fp.codigo
WHERE V.CODIGO = VI.CODIGO and
V.DATA_HORA BETWEEN :DATA_INI AND :DATA_FIN AND
VI.CODIGO_TITULAR = :COD_PROFISSIONAL AND
VI.CODIGO_PEDIDO = :COD_PEDIDO AND
VI.TIPO_PEDIDO = :TIPO AND
VI.ITEM_CANCELADO = 'Nao' AND
VI.TIPO IS NULL
group by 1,2 |
Meu resultado de soma é
Citação: | SUM = 32
SUM1 = 576,000
SUM4 = 570,500
SUM7 = 4103,000
|
Preciso que fique o mesmo resultado acima do primeiro select mais com a forma do segundo sql _________________ Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree |
|
Voltar ao Topo |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qua Abr 03, 2019 2:42 pm Assunto: |
|
|
Boa tarde,
Desconfio que o resultado está diferente porque a segunda query tem um Join a mais com a tabela vendas_pagamento (e dessa com a tabela FORMAS_PAGAMENTO), então serão retornados mais registros quando houver mais de um registro na vendas_pagamento para uma mesma venda.
Parece a princípio que esse Join não é necessário.
Espero que ajude
Editado pela última vez por imex em Seg Set 20, 2021 10:13 am, num total de 1 vez |
|
Voltar ao Topo |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Qua Abr 03, 2019 2:52 pm Assunto: |
|
|
imex escreveu: | Boa tarde,
Desconfio que o resultado está diferente porque a segunda query tem um Join a mais com a tabela vendas_pagamento (e dessa com a tabela FORMAS_PAGAMENTO), então serão retornados mais registros quando houver mais de um registro na vendas_pagamento para uma mesma venda.
Parece a princípio que esse Join não é necessário.
Espero que ajude
|
Olá Imex,. qual join vc acha que esta a mais ai?
Seria assim então pegando pelo descrição em vez de codigo ja que estão em lugares diferentes
Obrigado Código: | SELECT vi.quantidade,
v.data_hora,
SUM( QUANTIDADE ),
SUM( PRECO_TOTAL_DESC_AJUST ),
SUM( VALOR_RATEIO_TITULAR ),
SUM( VALOR_RATEIO_ASSISTENTE ),
SUM( CUSTO_COM_AQUISICAO ),
SUM( CUSTO_COM_PRODUTOS_TOTAL ),
SUM( CUSTO_OPERACIONAL ),
sum((select sum(vp.valor_parcela) from vendas_pagamento vp where vp.codigo = v.codigo and vp.anulado is null))
FROM VENDAS_ITENS VI
INNER JOIN VENDAS V ON V.CODIGO = VI.CODIGO
--INNER JOIN vendas_pagamento vp ON vp.codigo = v.codigo
-- AND vp.anulado is null
INNER JOIN FORMAS_PAGAMENTO fp ON vi.formas_pagamento = fp.descricao
WHERE V.CODIGO = VI.CODIGO and
V.DATA_HORA BETWEEN :DATA_INI AND :DATA_FIN AND
VI.CODIGO_TITULAR = :COD_PROFISSIONAL AND
VI.CODIGO_PEDIDO = :COD_PEDIDO AND
VI.TIPO_PEDIDO = :TIPO AND
VI.ITEM_CANCELADO = 'Nao' AND
VI.TIPO IS NULL
group by 1,2 |
_________________ Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree |
|
Voltar ao Topo |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qua Abr 03, 2019 3:23 pm Assunto: |
|
|
A idéia era remover os 2 Joins abaixo:
Código: | INNER JOIN vendas_pagamento vp ON vp.codigo = v.codigo
AND vp.anulado is null
INNER JOIN FORMAS_PAGAMENTO fp ON vp.forma_pagamento = fp.codigo
|
Você precisa desse join com a tabela FORMAS_PAGAMENTO? Não consegui identificar nenhum campo dessa tabela sendo utilizado na query. |
|
Voltar ao Topo |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Qua Abr 03, 2019 3:30 pm Assunto: |
|
|
imex escreveu: | A idéia era remover os 2 Joins abaixo:
Código: | INNER JOIN vendas_pagamento vp ON vp.codigo = v.codigo
AND vp.anulado is null
INNER JOIN FORMAS_PAGAMENTO fp ON vp.forma_pagamento = fp.codigo
|
Você precisa desse join com a tabela FORMAS_PAGAMENTO? Não consegui identificar nenhum campo dessa tabela sendo utilizado na query. |
A sim, vou precisar sim Imex, veja
Código: | SELECT
COALESCE(SUM( QUANTIDADE ),0) as QUANTIDADE,
COALESCE(SUM( PRECO_TOTAL_DESC_AJUST) - SUM( PRECO_TOTAL_DESC_AJUST * fp.desconto ) / 100,0) AS VALOR_FATURADO,
COALESCE(SUM( VALOR_RATEIO_TITULAR ),0) as VALOR_RATEIO_TITULAR,
COALESCE(SUM( VALOR_RATEIO_ASSISTENTE ),0) as VALOR_RATEIO_ASSISTENTE,
COALESCE(SUM( CUSTO_COM_AQUISICAO ),0) as CUSTO_COM_AQUISICAO,
COALESCE(SUM( CUSTO_COM_PRODUTOS_TOTAL ),0) as CUSTO_COM_PRODUTOS_TOTAL,
COALESCE(SUM( CUSTO_OPERACIONAL ),0) as CUSTO_OPERACIONAL,
COALESCE(SUM( (
SELECT SUM(vp.valor_parcela)
FROM vendas_pagamento vp
WHERE vp.codigo = v.codigo
AND vp.anulado IS NULL
)
),0) AS VALOR_PARCELA
FROM VENDAS_ITENS VI
INNER JOIN VENDAS V ON V.CODIGO = VI.CODIGO
INNER JOIN FORMAS_PAGAMENTO fp ON vi.formas_pagamento = fp.descricao
WHERE V.CODIGO = VI.CODIGO and
V.DATA_HORA BETWEEN :DATA_INI AND :DATA_FIN AND
VI.CODIGO_TITULAR = :COD_PROFISSIONAL AND
VI.CODIGO_PEDIDO = :COD_PEDIDO AND
VI.TIPO_PEDIDO = :TIPO AND
VI.ITEM_CANCELADO = 'Nao' AND
VI.TIPO IS NULL |
To fazendo somas, antes não tinha montado desta forma ainda. Desculpe _________________ Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree |
|
Voltar ao Topo |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Qua Abr 03, 2019 3:50 pm Assunto: |
|
|
Acho que vou ter que mudar aqui
Código: | COALESCE(SUM( PRECO_TOTAL_DESC_AJUST) - SUM( PRECO_TOTAL_DESC_AJUST * fp.desconto ) / 100,0) AS VALOR_FATURADO, |
Por este
Código: | CASE WHEN fp.desconto > 0 then
SUM( PRECO_TOTAL_DESC_AJUST - PRECO_TOTAL_DESC_AJUST * fp.desconto / 100)
ELSE
SUM( PRECO_TOTAL_DESC_AJUST)
END AS VALOR_FATURADO, |
Mais esta dando erro
Nova sintaxe
Código: | SELECT
COALESCE(SUM( QUANTIDADE ),0) as QUANTIDADE,
--COALESCE(SUM( PRECO_TOTAL_DESC_AJUST) - SUM( PRECO_TOTAL_DESC_AJUST * fp.desconto ) / 100,0) AS VALOR_FATURADO,
CASE WHEN fp.desconto > 0 then
SUM( PRECO_TOTAL_DESC_AJUST - PRECO_TOTAL_DESC_AJUST * fp.desconto / 100)
ELSE
SUM( PRECO_TOTAL_DESC_AJUST)
END AS VALOR_FATURADO,
COALESCE(SUM( VALOR_RATEIO_TITULAR ),0) as VALOR_RATEIO_TITULAR,
COALESCE(SUM( VALOR_RATEIO_ASSISTENTE ),0) as VALOR_RATEIO_ASSISTENTE,
COALESCE(SUM( CUSTO_COM_AQUISICAO ),0) as CUSTO_COM_AQUISICAO,
COALESCE(SUM( CUSTO_COM_PRODUTOS_TOTAL ),0) as CUSTO_COM_PRODUTOS_TOTAL,
COALESCE(SUM( CUSTO_OPERACIONAL ),0) as CUSTO_OPERACIONAL,
COALESCE(SUM( (
SELECT SUM(vp.valor_parcela)
FROM vendas_pagamento vp
WHERE vp.codigo = v.codigo
AND vp.anulado IS NULL
)
),0) AS VALOR_PARCELA
FROM VENDAS_ITENS VI
INNER JOIN VENDAS V ON V.CODIGO = VI.CODIGO
INNER JOIN FORMAS_PAGAMENTO fp ON vi.formas_pagamento = fp.descricao
WHERE V.CODIGO = VI.CODIGO and
V.DATA_HORA BETWEEN :DATA_INI AND :DATA_FIN AND
VI.CODIGO_TITULAR = :COD_PROFISSIONAL AND
VI.CODIGO_PEDIDO = :COD_PEDIDO AND
VI.TIPO_PEDIDO = :TIPO AND
VI.ITEM_CANCELADO = 'Nao' AND
VI.TIPO IS NULL |
Citação: | Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause). |
Acho que assim resolve
Código: | COALESCE(SUM( PRECO_TOTAL_DESC_AJUST) - COALESCE(SUM( PRECO_TOTAL_DESC_AJUST * fp.desconto ),0) / 100,0) AS VALOR_FATURADO, |
_________________ Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree |
|
Voltar ao Topo |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qua Abr 03, 2019 4:08 pm Assunto: |
|
|
Acho que você pode usar a descrição no Join se é possível garantir que essa descrição existe na tabela de formas de pagamento.
Sobre o Case, não entendi porque ele seria necessário, mas se for o caso experimente coloca-lo dentro do Sum conforme exemplo abaixo:
Código: | SUM( PRECO_TOTAL_DESC_AJUST -
CASE WHEN fp.desconto > 0
then PRECO_TOTAL_DESC_AJUST * fp.desconto / 100
else 0
end ) |
Espero que ajude |
|
Voltar ao Topo |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
|
Voltar ao Topo |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Qui Abr 04, 2019 10:07 am Assunto: |
|
|
Realmente preciso seguir esta logica aqui
Código: | SELECT vi.nome_pedido,
--FP.descricao,
SUM( QUANTIDADE ) as QUANTIDADE,
SUM( PRECO_TOTAL_DESC_AJUST) AS VALOR_ORIGINAL,
vp.desconto_forma_pagamento AS INDICE_DESCONTO,
-- COALESCE(SUM( PRECO_TOTAL_DESC_AJUST) - COALESCE(SUM( PRECO_TOTAL_DESC_AJUST * fp.desconto ),0) / 100,0) AS VALOR_FATURADO,
COALESCE(SUM( PRECO_TOTAL_DESC_AJUST) - COALESCE(SUM( PRECO_TOTAL_DESC_AJUST * vp.desconto_forma_pagamento ),0) / 100,0) AS VALOR_FATURADO,
SUM( VALOR_RATEIO_TITULAR ) as VALOR_RATEIO_TITULAR,
SUM( VALOR_RATEIO_ASSISTENTE ) as VALOR_RATEIO_ASSISTENTE,
SUM( CUSTO_COM_AQUISICAO ) as CUSTO_COM_AQUISICAO,
SUM( CUSTO_COM_PRODUTOS_TOTAL ) as CUSTO_COM_PRODUTOS_TOTAL,
SUM( CUSTO_OPERACIONAL ) as CUSTO_OPERACIONAL,
SUM( (
select sum(vp.valor_parcela)
from vendas_pagamento vp
where vp.codigo = v.codigo
and vp.anulado is null
)
) AS VALOR_PARCELA
FROM VENDAS_ITENS VI
INNER JOIN VENDAS V ON V.CODIGO = VI.CODIGO
--INNER JOIN FORMAS_PAGAMENTO fp ON vi.formas_pagamento = fp.descricao
INNER JOIN vendas_pagamento vp ON vp.codigo = v.codigo
AND vp.anulado is null
WHERE V.CODIGO = VI.CODIGO and
V.DATA_HORA BETWEEN :DATA_INI AND :DATA_FIN AND
VI.CODIGO_TITULAR = :COD_PROFISSIONAL AND
VI.CODIGO_PEDIDO in (4,14,15,18,19,20,21,23,164) and -- = :COD_PEDIDO AND
VI.TIPO_PEDIDO = :TIPO AND
VI.ITEM_CANCELADO = 'Nao' AND
VI.TIPO IS NULL
GROUP BY 1,4, VI.CODIGO_PEDIDO
order by VI.CODIGO_PEDIDO |
Mas ai os valores não batem como mencionei acima.
Este aqui ficou falho
Código: | INNER JOIN FORMAS_PAGAMENTO fp ON vi.formas_pagamento = fp.descricao |
_________________ Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree |
|
Voltar ao Topo |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qui Abr 04, 2019 11:03 am Assunto: |
|
|
Pode existir mais de um registro na tabela vendas_pagamento para uma mesma venda?
Se pode, pode ocorrer de o valor do campo desconto_forma_pagamento ser diferente entre esses registros da mesma venda? |
|
Voltar ao Topo |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Qui Abr 04, 2019 11:20 am Assunto: |
|
|
imex escreveu: | Pode existir mais de um registro na tabela vendas_pagamento para uma mesma venda?
Se pode, pode ocorrer de o valor do campo desconto_forma_pagamento ser diferente entre esses registros da mesma venda? |
Pode existir mais de um registro na tabela vendas_pagamento para uma mesma venda?
R: Pode sim existe varias formas de pagamento em uma unica nota
Se pode, pode ocorrer de o valor do campo desconto_forma_pagamento ser diferente entre esses registros da mesma venda?
Sim algumas formas de pagamento pode haver um indice de desconto_forma_pagamento, ja outros não, isso tudo na mesma nota fiscal. _________________ Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree |
|
Voltar ao Topo |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qui Abr 04, 2019 11:39 am Assunto: |
|
|
adriano_servitec escreveu: | Sim algumas formas de pagamento pode haver um indice de desconto_forma_pagamento, ja outros não, isso tudo na mesma nota fiscal. |
Como deve ser feito o calculo nesses casos? |
|
Voltar ao Topo |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Qui Abr 04, 2019 11:51 am Assunto: |
|
|
imex escreveu: | adriano_servitec escreveu: | Sim algumas formas de pagamento pode haver um indice de desconto_forma_pagamento, ja outros não, isso tudo na mesma nota fiscal. |
Como deve ser feito o calculo nesses casos? |
Assim, fiz a venda nr 195252 valor da nota 1,00
Gravou na tabela vendas_pagamentos
195252-dinheiro-0,200, desconto_forma_pagamento-0,000, valor_total-0,200
195252-cartao debito-0,800, desconto_forma_pagamento-30,000, valor_total-0,560 _________________ Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree |
|
Voltar ao Topo |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qui Abr 04, 2019 2:20 pm Assunto: |
|
|
Você pode acrescentar o Alias antes do nome de cada campo utilizado na query para identificar de qual tabela eles são? |
|
Voltar ao Topo |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Qui Abr 04, 2019 2:37 pm Assunto: |
|
|
imex escreveu: | Você pode acrescentar o Alias antes do nome de cada campo utilizado na query para identificar de qual tabela eles são? |
Sim
Código: | SELECT
COALESCE(SUM( vi.quantidade ),0) as QUANTIDADE,
COALESCE(SUM( vi.preco_total_desc_ajust) - COALESCE(SUM( vi.preco_total_desc_ajust * vp.desconto_forma_pagamento ),0) / 100,0) AS VALOR_FATURADO,
COALESCE(SUM( vi.valor_rateio_titular ),0) as VALOR_RATEIO_TITULAR,
COALESCE(SUM( vi.valor_rateio_assistente ),0) as VALOR_RATEIO_ASSISTENTE,
COALESCE(SUM( vi.custo_com_aquisicao ),0) as CUSTO_COM_AQUISICAO,
COALESCE(SUM( vi.custo_com_produtos_total ),0) as CUSTO_COM_PRODUTOS_TOTAL,
COALESCE(SUM( vi.custo_operacional ),0) as CUSTO_OPERACIONAL,
COALESCE(SUM( (
SELECT SUM(vp.valor_parcela)
FROM vendas_pagamento vp
WHERE vp.codigo = v.codigo
AND vp.anulado IS NULL
)
),0) AS VALOR_PARCELA
FROM VENDAS_ITENS VI
INNER JOIN VENDAS V ON V.CODIGO = VI.CODIGO
INNER JOIN vendas_pagamento vp ON vp.codigo = v.codigo
AND vp.anulado is null
WHERE V.CODIGO = VI.CODIGO and
V.DATA_HORA BETWEEN :DATA_INI AND :DATA_FIN AND
VI.CODIGO_TITULAR = :COD_PROFISSIONAL AND
VI.CODIGO_PEDIDO = :COD_PEDIDO AND
VI.TIPO_PEDIDO = :TIPO AND
VI.ITEM_CANCELADO = 'Nao' AND
VI.TIPO IS NULL |
_________________ Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree |
|
Voltar ao Topo |
|
 |
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|