首页 > 解决方案 > 选择相关表中第一行和最后一行的总和

问题描述

在我的表中,我有这三个表:

团队:

Id GUID UNIQUE PRIMARY
Name NVARCHAR

参与者:

Id GUID UNIQUE PRIMARY
FirstName NVARCHAR
[....]
TeamId GUID

参与者资料:

Id GUID UNIQUE PRIMARY
Weight FLOAT
Date DATETIME
ParticipantId GUID
TeamId GUID

我需要的是一个 SQL 查询,它为我提供了 Teams 中的所有列,并且:

解释:

我有很多参与者(团队成员)每隔一段时间(体重+日期)报告他们的体重。我想要完成的是计算所有团队成员的体重减轻。

在 2019-01-03 参与者 1 报告体重 78

2019-01-06 参与者 1 报告体重 75

在 2019-01-04 参与者 2 报告体重 86

于 2019-01-07 参与者 2 报告体重 83

我需要查询来获得 SumOfFirstWeights (78 + 86) = 164

我需要查询来获取 SumOfLastWeights (75 + 83) = 158

这让我减重了6。

我尝试了很多组合:

Select *, 
(SELECT TOP (1) Sum(Weight) 
 FROM ParticipantData WHERE (TeamId = Teams.Id) 
 GROUP BY ParticipantId
)
ORDER BY Date As SumOfFirstWeights 
From Teams

标签: sqlsql-server

解决方案


您的问题是每组的某种最大/最低值,此外,您需要这些值的总和。

select t.id, t.name, sum(t1.weight), sum(t2.weight)
from teams t
left join
(
    select pd.teamid, pd.participantid, pd.weight
    from ParticipantData pd
    join 
    (
        select teamid, participantid, min(date) min_date
        from ParticipantData 
        group by teamid, participantid
    ) t on pd.teamid = t.teamid and 
           pd.participantid = t.participantid and
           pd.date = t.min_date
) t1 on t.id = t1.teamid
left join 
(
    select pd.teamid, pd.participantid, pd.weight
    from ParticipantData pd
    join 
    (
        select teamid, participantid, max(date) max_date
        from ParticipantData 
        group by teamid, participantid
    ) t on pd.teamid = t.teamid and 
           pd.participantid = t.participantid and
           pd.date = t.max_date
) t2 on t1.teamid = t2.teamid and
        t1.participantid = t2.participantid
group by t.id, t.name

推荐阅读