【问题标题】:MySQL SUM, join and union 4 tablesMySQL SUM,连接和联合 4 个表
【发布时间】:2018-02-22 09:55:58
【问题描述】:

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

任何帮助将不胜感激

【问题讨论】:

    标签: mysql join sum union


    【解决方案1】:

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

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

    如果你不喜欢“null”值,你可以用一个合并函数包装 sum(),比如

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

    【讨论】:

    • 非常感谢,这完全符合预期。我根据您的建议添加合并以避免 NULL
    【解决方案2】:

    根据您的查询,结果如下

    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

    【讨论】:

    • 检查我编辑的答案,看看它是否能解决您的问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-13
    • 1970-01-01
    • 2023-04-06
    • 2012-08-08
    • 2013-01-20
    • 2017-06-09
    相关资源
    最近更新 更多