我正在尝试使用内部联接求和。我在另一个表上使用内部联接有4个表。
Table 1 = mov_estoque
Table 2 = saidas
Table 3 = produtos
Table 4 = movimento
Table 5 = nf
在表1上,有一个列EMPENHO
,如果列PRODUTO
相同,我想求和。
我的代码:
select m.DATA
,n.NOTA
,p.COD_PRODUTO
,p.DESCRICAO1
,p.FATOR_CA
,sum(m.EMPENHO) as Total
from mov_estoque as m
inner join saidas as s on m.origem = s.saida
inner join produtos as p on m.produto = p.produto
inner join movimento as t on m.origem = t.cod_operacao
inner join nf as n on s.saida = n.cod_operacao
where m.DATA>'2018-10-01'
and s.filial='3'
and p.tipo_prod='AC'
and (t.evento='21' or t.evento='35')
and m.tipo_origem ='S'
and s.cancelada='F'
and n.cancelada='F'
group by m.produto
order by m.data
但是此代码不起作用,我需要基于produto列的empenho的总和。
我需要的输出: http://prntscr.com/l9gk94
DATA NOTA COD_PRODUTO DESCRICAO1 EMPENHO FATOR_CA TOTAL
02/10/2018 00:00 164406 900809 SAL DO HIMALAIA FINO (GRANEL 1KG) -1 1 0
答案 0 :(得分:0)
我们可以使用内联视图来汇总,预先计算总计,然后进行联接。
例如,我们可以编写这样的查询,以获取由produto分组的EMPHENHO的总和。
SELECT sm.produto
, SUM(sm.EMPENHO) AS sum_empenho
FROM mov_estoque sm
WHERE sm.DATA > '2018-10-01'
AND sm.tipo_origem = 'S'
GROUP
BY sm.produto
总的规格在这个问题上不清楚。这可能不是所需的总数。但这确实说明了如何获得总和,每个produto
的值都是一行。
假设查询的其余部分返回我们要返回的明细行,即我们省略了GROUP BY
子句和SUM
聚合:
SELECT m.DATA
, n.NOTA
, p.COD_PRODUTO
, p.DESCRICAO1
, p.FATOR_CA
FROM mov_estoque m
JOIN saidas as s on m.origem = s.saida
JOIN produtos as p on m.produto = p.produto
JOIN movimento as t on m.origem = t.cod_operacao
JOIN nf as n on s.saida = n.cod_operacao
WHERE m.DATA > '2018-10-01'
AND s.filial = '3'
AND p.tipo_prod = 'AC'
AND (t.evento='21' OR t.evento='35')
AND m.tipo_origem = 'S'
AND s.cancelada='F'
AND n.cancelada='F'
ORDER BY m.data
如果这使我们得到要返回的行,我们只想添加“总计”列。
然后,我们可以将第一个查询用作行源。将其包装在括号中,并以内联视图的形式引用FROM
子句,并带有适当的连接条件,并在SELECT列表中引用包含预汇总总数的列。像这样:
SELECT m.DATA
, n.NOTA
, p.COD_PRODUTO
, p.DESCRICAO1
, p.FATOR_CA
, s.sum_empenho AS total
FROM mov_estoque m
JOIN saidas as s on m.origem = s.saida
JOIN produtos as p on m.produto = p.produto
JOIN movimento as t on m.origem = t.cod_operacao
JOIN nf as n on s.saida = n.cod_operacao
JOIN ( SELECT sm.produto
, SUM(sm.EMPENHO) AS sum_empenho
FROM mov_estoque sm
WHERE sm.DATA > '2018-10-01'
AND sm.tipo_origem = 'S'
GROUP
BY sm.produto
) s
ON s.produto = m.produto
WHERE m.DATA > '2018-10-01'
AND s.filial = '3'
AND p.tipo_prod = 'AC'
AND (t.evento='21' OR t.evento='35')
AND m.tipo_origem = 'S'
AND s.cancelada='F'
AND n.cancelada='F'
ORDER BY m.data