mysql - SQL 内连接与 Sum
问题描述
我正在尝试将值与内部连接相加。有 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
解决方案
我们可以使用内联视图来聚合、预计算总计,然后进行连接。
例如,我们可以编写这样的查询,以获取按产品分组的 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
推荐阅读
- javascript - 将本地声明的变量引用到chartjs数据的数组中
- apache-kafka - 最新(版本:Fishtown.SR2)spring-cloud-stream不支持kafka客户端2.1.0或更高版本?
- dart - Sqlite 数据库集成给出错误
- oracle - 如何在apex18.2的模型对话页面中删除x按钮
- ruby-on-rails - 哈希中的 Sort_by - 反转或不反转 - 如何?
- android - 该视图不是 CoordinatorLayout 的子视图
- delphi - 获取 Web 服务以使用证书
- java - 如何使用 TestNG 在两个不同的浏览器中并行运行两种测试方法?
- javascript - 单击其他页面上的按钮响应时?
- amazon-web-services - 构建项目时出现 AWS CodeBuild 错误 => YAML_FILE_ERROR 消息:此构建映像不支持运行时版本选择