Mysql 将同一表格合并2次,然后进行总结->;将实际需要的值加倍

Mysql 将同一表格合并2次,然后进行总结->;将实际需要的值加倍,mysql,sql,group-by,sum,Mysql,Sql,Group By,Sum,我有一个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} <

我有一个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'

但这不适用于求和,因为有些人有相同的值(比如年龄)。将不同的年龄相加以得到总年龄是行不通的;)

您似乎正在处理N-M连接。为了避免重复计算
SUM
s,一种解决方案是将聚合查询移动到
JOIN
s,如下所示:

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

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

您应该连接子查询进行求和

  select L.ID, P.FIRSTNAME as Firstname, P.LASTNAME as Lastname, r1.sum_1, r2.sum_2
  from LABORATORY L 
  INNER JOIN (
    select  ID, PERID,  SUM(VAL) sum_1
    from RESULT 
    where RESID='Thingy1'
    group by ID, PERID
  ) r1 on r1.PERID = P.PERID AND r1.ID = L.ID
  INNER JOIN (
    select  ID, PERID,  SUM(VAL) sum_2
    from RESULT 
    where RESID='Thingy2'
    group by ID, PERID

  ) r2 on r2.PERID = P.PERID AND r2.ID = L.ID
  INNER PERSON P ON P.PERID = r1.PERID 

你为什么要和你的桌子坐两次?你们的歌剧团在哪里?您的示例输出是什么?因为它是一个结果表,我正在检索两个不同的结果(我构建了两个结果的总和)。对于系统中的每个元素,结果的数量是可变的,这就是为什么要这样做。
  select L.ID, P.FIRSTNAME as Firstname, P.LASTNAME as Lastname, r1.sum_1, r2.sum_2
  from LABORATORY L 
  INNER JOIN (
    select  ID, PERID,  SUM(VAL) sum_1
    from RESULT 
    where RESID='Thingy1'
    group by ID, PERID
  ) r1 on r1.PERID = P.PERID AND r1.ID = L.ID
  INNER JOIN (
    select  ID, PERID,  SUM(VAL) sum_2
    from RESULT 
    where RESID='Thingy2'
    group by ID, PERID

  ) r2 on r2.PERID = P.PERID AND r2.ID = L.ID
  INNER PERSON P ON P.PERID = r1.PERID