繁体   English   中英

MySQL SUM,join和union 4表

[英]MySQL SUM, join and union 4 tables

我有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 

任何帮助,将不胜感激

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

最后,您将使用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`

与您的查询,结果如下

 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 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 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM