MySQL SUM,join和union 4表

时间:2018-02-22 09:55:59

标签: mysql join sum union

我有4个列名相似的表:

Table 1 : simp_wajib
id    anggota    nilai
1     nama1      100
2     nama2      100
3     nama1      100

Table 2 : simp_pokok
id    anggota    nilai
1     nama2      100
2     nama3      100
3     nama1      100

Table 3 : simp_sukarela
id    anggota    nilai
1     nama2      100
2     nama2      100
3     nama1      100

Table 4 : simp_berjangka
id    anggota    nilai
1     nama3      100
2     nama2      100
3     nama3      100

我尝试使用以下查询加入这四个表,但它给了我不正确的总和值

SELECT nama.anggota, sum(simp_wajib.nilai) as wajib, sum(simp_pokok.nilai) as pokok,sum(simp_sukarela.nilai) as sukarela,sum(simp_berjangka.nilai) as berjangka
FROM
(SELECT anggota from simp_pokok
 UNION
 SELECT anggota FROM simp_wajib) nama
 LEFT JOIN simp_pokok ON simp_pokok.anggota=nama.anggota
 LEFT JOIN simp_wajib ON simp_wajib.anggota=nama.anggota
 LEFT JOIN simp_sukarela ON simp_sukarela.anggota=nama.anggota
 LEFT JOIN simp_berjangka ON simp_berjangka.anggota=nama.anggota
 group by nama.anggota

任何帮助将不胜感激

2 个答案:

答案 0 :(得分:0)

如果您加入表格,最终会得到比预期更多的行,因为联接将跨越表格之间的值。 您可能需要的是,所有表之间的联合,总结常见值,首先按公共列分组,然后从您将添加的自定义字段中跟踪原始表。

最后,您将使用CASE语句转置结果。

coalesce(sum(CASE ...), 0) as `simp_pokok`

如果您不喜欢“null”值,可以使用coalesce函数包装sum(),例如

parentRec

答案 1 :(得分:0)

使用您的查询,结果如下



anggota nilai 	origin
1		200		simp_berjangka
1		200		simp_pokok
1		100		simp_sukarela
1		400		simp_wajib
2		300		simp_sukarela
2		500		simp_wajib
3		100		simp_pokok
3		200		simp_sukarela
4		200		simp_berjangka




我的预期输出是每个由anggota分组的总和值



anggota sum(simp_pokok)	sum(simp_wajib)	sum(simp_berjangka)	sum(simp_sukarela)
1		200		400		200		200
2		0		500		0		300
3		100		0		0		200						
4		0		0		200		0