SQL内部连接总和

时间:2018-10-23 12:34:27

标签: mysql

我正在尝试使用内部联接求和。我在另一个表上使用内部联接有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

1 个答案:

答案 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