我有 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
任何帮助将不胜感激
最佳答案
如果您连接表,您最终会得到比预期更多的行,因为连接会跨越表之间的值。 您可能需要的是所有表之间的联合,以汇总公共(public)值,首先按公共(public)列分组,然后从您将添加的自定义字段中添加以跟踪原始表。
最后,您将使用 CASE 语句转置结果。
select anggota,
sum(CASE WHEN origin = 'simp_pokok' THEN nilai END) `simp_pokok`,
sum(CASE WHEN origin = 'simp_wajib' THEN nilai END) `simp_wajib`,
sum(CASE WHEN origin = 'simp_sukarela' THEN nilai END) `simp_sukarela`,
sum(CASE WHEN origin = 'simp_berjangka' THEN nilai END) `simp_berjangka`
from (
SELECT nama.anggota, sum(nilai) as nilai, origin
FROM
(SELECT anggota, nilai, 'simp_pokok' as origin from simp_pokok
UNION ALL
SELECT anggota, nilai, 'simp_wajib' as origin FROM simp_wajib
UNION ALL
SELECT anggota, nilai, 'simp_sukarela' as origin FROM simp_sukarela
UNION ALL
SELECT anggota, nilai, 'simp_berjangka' as origin FROM simp_berjangka
) nama
group by nama.anggota, nama.origin) united
group by anggota
如果你不喜欢“空”值,你可以用合并函数包装 sum(),比如
coalesce(sum(CASE ...), 0) as `simp_pokok`
关于MySQL SUM、join 和 union 4 个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48924362/