如何使视图中TotalScore与Reference数据唯一关联,避免重复求和?
问题解决方法
问题根源在于你先通过RateeId将prs_rate与prs_totalratee关联,再执行SUM计算。这种一对多关联会让同一条评分记录被重复匹配到不同的Reference记录上,最终导致相同RateeId下不同Reference的TotalScore完全一致。
正确的处理逻辑是先计算每个RateeId的总分,再关联其他表,避免重复计算。修改后的视图脚本如下:
select e.Id, b.Name, f.SiteName, e.Reference, e.Amount, e.DateTransaction, rate_total.TotalScore, a.Status, a.CreatedByUserId from prs_totalratee as e left outer join core_vSiteInfo as f on e.SiteCatered = f.siteCode left outer join prs_ratee as b on e.RateeId = b.Id left outer join ( -- 先按RateeId、状态、创建人分组计算总分 select RateeId, Status, CreatedByUserId, SUM(Score * (c.Weight / 100) * (d.Weight / 100)) as TotalScore from prs_rate as a left outer join prs_kpi as c on a.KpiId = c.Id left outer join prs_group as d on c.GroupId = d.Id group by RateeId, Status, CreatedByUserId ) as rate_total on e.RateeId = rate_total.RateeId -- 关联prs_rate时匹配状态和创建人,保证数据一致性 left outer join prs_rate as a on e.RateeId = a.RateeId and a.Status = rate_total.Status and a.CreatedByUserId = rate_total.CreatedByUserId group by e.Id, b.Name, f.SiteName, e.Reference, e.Amount, e.DateTransaction, rate_total.TotalScore, a.Status, a.CreatedByUserId
核心调整说明
- 新增子查询
rate_total:先按RateeId、Status、CreatedByUserId分组,单独计算每个被评分人的总分,确保同一RateeId的分数只计算一次。 - 主查询以
prs_totalratee为基准关联其他表:避免一对多关联导致的重复计算问题,让每个Reference对应正确的独立总分。 - 补充关联匹配条件:关联
prs_rate时增加Status和CreatedByUserId的匹配,保证评分状态、创建人与总分的对应关系准确。
内容的提问来源于stack exchange,提问作者Clyde Tome
相关产品推荐
相关产品推荐

