MYSQL select 连接多个 table 和 SUM
MYSQL select join multiple table and SUM
我有三张表
1.master
id_master barcode name last_stock
1 123 abc 15
2 234 bcd 10
3 345 cde 7
4 456 def 11
5 567 efg 20
2。 trans_in
id_trans_in barcode qty time_trans
1 567 1 2016-04-01 10:15:09
2 234 2 2016-04-01 14:15:09
3 345 5 2016-04-01 20:15:09
3。 trans_out
id_trans_out barcode qty time_trans
1 123 3 2016-04-01 09:15:09
2 234 5 2016-04-01 08:15:09
我必须建立一个查询来给出结果
id_master barcode name last_stock in out
1 123 abc 15 0 3
2 234 bcd 10 2 5
3 345 cde 7 5 0
4 456 def 11 0 0
5 567 efg 20 1 0
我只是在尝试简单的查询
select
a.id_master, a.barcode, a.name,
COALESCE(SUM(b.qty),'0')
from
master a
inner join trans_in b
on a.barcode = b.barcode
where
date(b.time_trans) = '2016-04-01'
group by a.barcode
结果是
id_master barcode name COALESCE(SUM(b.qty),'0')
5 567 efg 1
2 234 bcd 2
3 345 cde 5
我不知道如何通过 time_trans(如果为 null 则为 0)合并 master、trans_in 和 trans_out 的完整列表,我已经尝试使用左连接、内连接其中三个,但结果让我头晕.. SUM 的结果超过了字段的数量,我真的不知道为什么。
您可以左连接到一些派生表,以防每个日期有多个条目
SELECT a.id_master ,
a.barcode ,
a.name ,
a.last_stock ,
COALESCE(b.`IN`, 0) AS `IN`,
COALESCE(c.`OUT`, 0) AS `OUT`
FROM master a
LEFT JOIN (SELECT barcode, SUM(qty) as `IN`
FROM trans_in
WHERE date(time_trans) = '2016-04-01'
GROUP BY barcode ) b ON a.barcode = b.barcode
LEFT JOIN (SELECT barcode, SUM(qty) as `OUT`
FROM trans_out
WHERE date(time_trans) = '2016-04-01'
GROUP BY barcode ) c ON a.barcode = c.barcode;
例如:
SELECT m.*
, COALESCE(SUM(CASE WHEN type = 'trans_in' THEN qty END),0) `in`
, COALESCE(SUM(CASE WHEN type = 'trans_out' THEN qty END),0) `out`
FROM master m
LEFT
JOIN
( SELECT 'trans_in' type
, id_trans_in id_trans
, barcode
, qty
, time_trans
FROM trans_in
WHERE time_trans BETWEEN '2016-04-01 00:00:00' AND '2016-04-01 23:23:59'
UNION ALL
SELECT 'trans_out'
, id_trans_out
, barcode
, qty,time_trans
FROM trans_out
WHERE time_trans BETWEEN '2016-04-01 00:00:00' AND '2016-04-01 23:23:59'
) x
ON x.barcode = m.barcode
GROUP
BY m.id_master
ORDER
BY id_master;
考虑将交易存储在单个 table 中。它将简化和加速这一过程。此外,我假设在 time_trans 上有一个 INDEX,并相应地构建了一个范围查询。
我有三张表
1.master
id_master barcode name last_stock
1 123 abc 15
2 234 bcd 10
3 345 cde 7
4 456 def 11
5 567 efg 20
2。 trans_in
id_trans_in barcode qty time_trans
1 567 1 2016-04-01 10:15:09
2 234 2 2016-04-01 14:15:09
3 345 5 2016-04-01 20:15:09
3。 trans_out
id_trans_out barcode qty time_trans
1 123 3 2016-04-01 09:15:09
2 234 5 2016-04-01 08:15:09
我必须建立一个查询来给出结果
id_master barcode name last_stock in out
1 123 abc 15 0 3
2 234 bcd 10 2 5
3 345 cde 7 5 0
4 456 def 11 0 0
5 567 efg 20 1 0
我只是在尝试简单的查询
select
a.id_master, a.barcode, a.name,
COALESCE(SUM(b.qty),'0')
from
master a
inner join trans_in b
on a.barcode = b.barcode
where
date(b.time_trans) = '2016-04-01'
group by a.barcode
结果是
id_master barcode name COALESCE(SUM(b.qty),'0')
5 567 efg 1
2 234 bcd 2
3 345 cde 5
我不知道如何通过 time_trans(如果为 null 则为 0)合并 master、trans_in 和 trans_out 的完整列表,我已经尝试使用左连接、内连接其中三个,但结果让我头晕.. SUM 的结果超过了字段的数量,我真的不知道为什么。
您可以左连接到一些派生表,以防每个日期有多个条目
SELECT a.id_master ,
a.barcode ,
a.name ,
a.last_stock ,
COALESCE(b.`IN`, 0) AS `IN`,
COALESCE(c.`OUT`, 0) AS `OUT`
FROM master a
LEFT JOIN (SELECT barcode, SUM(qty) as `IN`
FROM trans_in
WHERE date(time_trans) = '2016-04-01'
GROUP BY barcode ) b ON a.barcode = b.barcode
LEFT JOIN (SELECT barcode, SUM(qty) as `OUT`
FROM trans_out
WHERE date(time_trans) = '2016-04-01'
GROUP BY barcode ) c ON a.barcode = c.barcode;
例如:
SELECT m.*
, COALESCE(SUM(CASE WHEN type = 'trans_in' THEN qty END),0) `in`
, COALESCE(SUM(CASE WHEN type = 'trans_out' THEN qty END),0) `out`
FROM master m
LEFT
JOIN
( SELECT 'trans_in' type
, id_trans_in id_trans
, barcode
, qty
, time_trans
FROM trans_in
WHERE time_trans BETWEEN '2016-04-01 00:00:00' AND '2016-04-01 23:23:59'
UNION ALL
SELECT 'trans_out'
, id_trans_out
, barcode
, qty,time_trans
FROM trans_out
WHERE time_trans BETWEEN '2016-04-01 00:00:00' AND '2016-04-01 23:23:59'
) x
ON x.barcode = m.barcode
GROUP
BY m.id_master
ORDER
BY id_master;
考虑将交易存储在单个 table 中。它将简化和加速这一过程。此外,我假设在 time_trans 上有一个 INDEX,并相应地构建了一个范围查询。