加入 3 Table 总和组 MySQL PHP
Join 3 Table Sum Group By MySQL PHP
我正在使用 Codeigniter,我想求和(stock_in)和求和(stock_out)并按 id_barang:
分组
Table 股票
代码
姓名
现货
B01
图书
40
Table 库存在
代码
姓名
进货
B01
图书
20
B01
图书
10
Table 缺货
代码
姓名
缺货
B01
图书
5
B01
图书
10
我要结果:
摘要
代码
姓名
现货
进货
缺货
最后库存
B01
图书
40
30
15
55
最后库存 = (库存 + 进货) - 缺货
我可以加入 3 个 table,但是 sum(stock_in) 和 sum(stock_out) 是这样的:
代码
姓名
现货
进货
缺货
最后库存
B01
图书
40
60
30
70
根据您想要的输出,此处使用 INNER JOIN。但是如果 stock_in 和 Stock_out table 中不存在代码 (B01),则使用 LEFT JOIN 而不是 INNER JOIN。金额字段使用COALESCE函数忽略NULL。
-- MySQL
SELECT s.code, s.name, s.stock, si.stock_in, so.stock_out
, (s.stock + si.stock_in - so.stock_out) last_stock
FROM Stock s
INNER JOIN (SELECT code, MAX(name) name
, SUM(stock_in) stock_in
FROM Stock_in
GROUP BY code) si
ON s.code = si.code
INNER JOIN (SELECT code, MAX(name) name
, SUM(stock_out) stock_out
FROM Stock_out
GROUP BY code) so
ON s.code = so.code;
请检查 url http://sqlfiddle.com/#!9/6dc765/4
的结果
请检查使用左连接的结果http://sqlfiddle.com/#!9/9e97ef3/2
这是一种方法(使用 RahulBiswas 精心提供的 fiddle)...
SELECT s.code
, s.name
, s.stock
, SUM(CASE WHEN direction = 'in' THEN qty END) stock_in
, SUM(CASE WHEN direction = 'out' THEN qty END) stock_out
, s.stock+SUM(CASE WHEN direction = 'in' THEN qty END)-SUM(CASE WHEN direction = 'out' THEN qty END) balance
FROM stock s
JOIN
( SELECT code
, name
, stock_in qty
, 'in' direction
FROM stock_in
UNION ALL
SELECT code
, name
, stock_out
, 'out'
FROM stock_out
) x
ON x.code = s.code;
我正在使用 Codeigniter,我想求和(stock_in)和求和(stock_out)并按 id_barang:
分组Table 股票
代码 | 姓名 | 现货 |
---|---|---|
B01 | 图书 | 40 |
Table 库存在
代码 | 姓名 | 进货 |
---|---|---|
B01 | 图书 | 20 |
B01 | 图书 | 10 |
Table 缺货
代码 | 姓名 | 缺货 |
---|---|---|
B01 | 图书 | 5 |
B01 | 图书 | 10 |
我要结果: 摘要
代码 | 姓名 | 现货 | 进货 | 缺货 | 最后库存 |
---|---|---|---|---|---|
B01 | 图书 | 40 | 30 | 15 | 55 |
最后库存 = (库存 + 进货) - 缺货
我可以加入 3 个 table,但是 sum(stock_in) 和 sum(stock_out) 是这样的:
代码 | 姓名 | 现货 | 进货 | 缺货 | 最后库存 |
---|---|---|---|---|---|
B01 | 图书 | 40 | 60 | 30 | 70 |
根据您想要的输出,此处使用 INNER JOIN。但是如果 stock_in 和 Stock_out table 中不存在代码 (B01),则使用 LEFT JOIN 而不是 INNER JOIN。金额字段使用COALESCE函数忽略NULL。
-- MySQL
SELECT s.code, s.name, s.stock, si.stock_in, so.stock_out
, (s.stock + si.stock_in - so.stock_out) last_stock
FROM Stock s
INNER JOIN (SELECT code, MAX(name) name
, SUM(stock_in) stock_in
FROM Stock_in
GROUP BY code) si
ON s.code = si.code
INNER JOIN (SELECT code, MAX(name) name
, SUM(stock_out) stock_out
FROM Stock_out
GROUP BY code) so
ON s.code = so.code;
请检查 url http://sqlfiddle.com/#!9/6dc765/4
的结果请检查使用左连接的结果http://sqlfiddle.com/#!9/9e97ef3/2
这是一种方法(使用 RahulBiswas 精心提供的 fiddle)...
SELECT s.code
, s.name
, s.stock
, SUM(CASE WHEN direction = 'in' THEN qty END) stock_in
, SUM(CASE WHEN direction = 'out' THEN qty END) stock_out
, s.stock+SUM(CASE WHEN direction = 'in' THEN qty END)-SUM(CASE WHEN direction = 'out' THEN qty END) balance
FROM stock s
JOIN
( SELECT code
, name
, stock_in qty
, 'in' direction
FROM stock_in
UNION ALL
SELECT code
, name
, stock_out
, 'out'
FROM stock_out
) x
ON x.code = s.code;