mysql - 加入同一张表 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)
但这不适用于总和,因为有些人具有相同的值(例如年龄)。总结不同的年龄来获得总人口的年龄是行不通的;)
解决方案
您似乎正在处理 NM 加入。为避免重复计算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
使用这种技术,聚合发生在连接的子查询中,不会影响外部查询。
推荐阅读
- java - 正确映射 JPA 实体
- java - 如何跳过在同一行中插入的下一个变量?
- sql-server - sys.time_zone_info 的 current_utc_offset 分钟格式
- c# - 如何根据条目中发现的时差拆分 DateTime 列表?
- node.js - 如何在文档 Firebase Function Express 上创建子集合?
- .net - 使用 automapper 可以在单独的查询中映射子集合
- reactjs - 用于 NPM 的 React 独立库
- java - 使用 jdbc 运行 DB2 命令失败
- c - 在 C 中使用带有指针的 typedef
- xamarin.forms - 使用带有 xamarin 形式的蓝牙打印文本