首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL SUM、join和union 4表

问MySQL SUM、join和union 4表
EN

Stack Overflow用户
提问于 2018-02-22 17:55:59
回答 2查看 96关注 0票数 1

我有4个具有相似列名的表:

​

代码语言:javascript
复制
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

​

我尝试用下面的查询连接这四个表,但它给出了错误的sum值

​

代码语言:javascript
复制
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

​

任何帮助都将不胜感激

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-22 18:48:54

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

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

代码语言:javascript
复制
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“值,你可以用一个coalesce函数包装sum(),比如

代码语言:javascript
复制
coalesce(sum(CASE ...), 0) as `simp_pokok`
票数 0
EN

Stack Overflow用户

发布于 2018-02-22 21:28:56

对于您的查询,结果如下

​

代码语言:javascript
复制
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分组的总和值成为一列

​

代码语言:javascript
复制
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

​

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48924362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档