Mysql 将同一表格合并2次,然后进行总结->;将实际需要的值加倍
我有一个SQL查询,如下所示: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} <
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