Exemplo de relacionamento sem mudar a estrutura do banco de dado
Neste exemplo retornara os valores por tipo de pagamento, por impressora, por data
CAMPOS RETORNADOS:
ACUMULADO,IMPRESSORA,TIPO_PGTO,TOTAL,RECEBIDO,TROCO,SANGRIA,SUPRIMENTO, M.*
DETALHANDO:
V.* - VENDA_CABECALHO - Contém o financeiro das vendas e dados do cliente
M.* - MOVIMENTO - Contém Identificação dos fechamento, pode ser feito mais de um fechamento por dia
TP.* - TOTAL_TIPO_PGTO - Contém as formas de pagamento "parcelas", de cada Cupom Fiscal
P.* - TIPO_PAGAMENTO - Tabela com as formas de pagamento
Poderia colocar Sangria e Suprimento como LEFT JOIN, para efeito didático quis demonstrar como criar uma coluna com outro SELECT
M.* Retorna todos campos da tabela Movimento
Coalesce - Evita que retorne campo NULL
LEFT JOIN - Cria relacionamento e os campos que não tiver valores relacionado na tabela, retorna NULL, retorna toda tabela de acordo com o filtro na clausula WHERE, evitando que a linha toda, "REGISTRO" seja omitida, caso se use INNER JOIN
select v.DATA_VENDA AS ACUMULADO,m.ID_IMPRESSORA,p.DESCRICAO AS TIPO_PGTO,
COALESCE(sum(tp.VALOR), 0) - COALESCE(sum(v.troco),0) AS TOTAL,
COALESCE(sum(v.valor_recebido),0) AS RECEBIDO,
COALESCE(sum(v.troco),0) AS TROCO,
(select sum(valor) from sangria sg where m.id=sg.id_movimento AND sg.id_impressora=m.id_impressora AND sg.id_tipo_pagamento=p.id) as sangria,
(select sum(valor) from suprimento sp where m.id=sp.id_movimento AND sp.id_impressora=m.id_impressora AND sg.id_tipo_pagamento=p.id) as suprimento,
m.*
from venda_cabecalho v
LEFT JOIN movimento m ON (v.ID_MOVIMENTO = m.ID)
LEFT JOIN total_tipo_pgto tp ON (v.ID = tp.ID_VENDA_CABECALHO)
LEFT JOIN tipo_pagamento p ON (tp.ID_TIPO_PAGAMENTO = p.ID)
WHERE V.STATUS_VENDA <> 'C' AND v.DATA_VENDA BETWEEN '2018-11-01' AND '2018-11-31'
GROUP BY v.DATA_VENDA,m.ID_IMPRESSORA,p.id
ORDER BY v.DATA_VENDA,m.ID_IMPRESSORA,p.descricao