简体   繁体   English

MySQL SUM,join和union 4表

[英]MySQL SUM, join and union 4 tables

I have 4 tables with similar column name: 我有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 

I try to join the four tables with following query but it give me incorrect sum value 我尝试通过以下查询将四个表连接起来,但是它给了我不正确的总和值

 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 

Any help would be appreciated 任何帮助,将不胜感激

If you join the tables, you will end up with more lines than you expect, because the join will cross the values between the tables. 如果联接表,最终将得到比预期多的行,因为联接将跨越表之间的值。 What you probably need, is a union between all your tables, to summarize the common values, grouped by the common column first, and then from a custom field you will add to keep track of the origin table. 您可能需要的是所有表之间的联合,以汇总通用值,首先按通用列分组,然后从自定义字段中添加您以跟踪原始表。

Finally, you will transpose the results with a CASE statement. 最后,您将使用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

if you don't like the "null" values, you can wrap the sum() with a coalesce function, like 如果您不喜欢“空”值,则可以使用合并函数包装sum(),例如

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

With your query, the result is as follow 与您的查询,结果如下

 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 

My expected output is each sum value which is grouped by anggota become a column 我的预期输出是按总和分组的每个总和值成为一列

 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