首页 > 解决方案 > 加入同一张表 2 次,然后求和 -> 将实际想要的值加倍

问题描述

我有一个如下所示的 SQL 查询:

select L.ID, P.FIRSTNAME as Firstname, P.LASTNAME as Lastname, SUM(R.VAL), SUM(R2.VAL) from LABORATORY L
join RESULT R
    on L.ID=R.ID 
    and R.RESID='Thingy1'
join PERSON P
    on P.PERID=R.PERID
    and P.LASTNAME={Lastname} <-this is part of the framework I'm working with and gets replaced, don't worry about it
    and P.FIRSTNAME={Firstname}
join RESULT R2
    on R2.PERID=P.PERID
    and R2.RESID='Thingy2'

现在,由于我加入了 Result Table 2 次,因此两个总和都是应有的值的两倍。如果我留下 SUM,我会得到这张表。


123 马努·德雷尔

234 迈克尔·舒马赫

423 巴拉克奥巴马

123 马努·德雷尔

234 迈克尔·舒马赫

423 巴拉克奥巴马


抱歉,我不知道如何在此处正确显示表格:P

如您所见,此表中的每个值出现 2 次。如果我添加“不同”,则只有 3 个值(正确),但 SUM 的值仍然加倍。关于我能做些什么的任何线索都会有所帮助。通过计数,我实际上可以写:

count(distinct L.ID)

但这不适用于总和,因为有些人具有相同的值(例如年龄)。总结不同的年龄来获得总人口的年龄是行不通的;)

标签: mysqlsqlgroup-bysum

解决方案


您似乎正在处理 NM 加入。为避免重复计算SUMs,一种解决方案是将聚合查询移至JOINs,如下所示:

select 
    L.ID, 
    P.FIRSTNAME as Firstname, 
    P.LASTNAME as Lastname, 
    R1.sum_val, 
    R2.sum_val
from LABORATORY L
join (SELECT ID, SUM(VAL) sum_val FROM RESULT R WHERE RESID='Thingy1' GROUP BY ID) R
    on L.ID=R.ID 
join PERSON P
    on P.PERID=R.PERID
    and P.LASTNAME={Lastname}
    and P.FIRSTNAME={Firstname}
join (SELECT PERID, SUM(val) FROM RESULT WHERE R2.RESID='Thingy2' GROUP BY PERID) R2
    on R2.PERID=P.PERID

使用这种技术,聚合发生在连接的子查询中,不会影响外部查询。


推荐阅读