我的 SQL Server 数据库中有一个用户数据表,我正在尝试汇总这些数据。基本上,我需要一些最小值、最大值和总和值并按某些列进行分组
这是一个示例表:
Member ID | Name | DateJoined | DateQuit | PointsEarned | Address
00001 | Leyth | 1/1/2013 | 9/30/2013 | 57 | 123 FirstAddress Way
00002 | James | 2/1/2013 | 7/21/2013 | 34 | 4 street road
00001 | Leyth | 2/1/2013 | 10/15/2013| 32 | 456 LastAddress Way
00003 | Eric | 2/23/2013 | 4/14/2013 | 15 | 5 street road
Run Code Online (Sandbox Code Playgroud)
我希望汇总表显示如下结果:
Member ID | Name | DateJoined | DateQuit | PointsEarned | Address
00001 | Leyth | 1/1/2013 | 10/15/2013 | 89 | 123 FirstAddress Way
00002 | James | 2/1/2013 | 7/21/2013 | 34 | 4 street road
00003 | Eric | 2/23/2013 | 4/14/2013 | 15 | 5 street road
Run Code Online (Sandbox Code Playgroud)
这是我到目前为止的查询:
Member ID | Name | DateJoined | DateQuit | PointsEarned | Address
00001 | Leyth | 1/1/2013 | 9/30/2013 | 57 | 123 FirstAddress Way
00002 | James | 2/1/2013 | 7/21/2013 | 34 | 4 street road
00001 | Leyth | 2/1/2013 | 10/15/2013| 32 | 456 LastAddress Way
00003 | Eric | 2/23/2013 | 4/14/2013 | 15 | 5 street road
Run Code Online (Sandbox Code Playgroud)
这次的工作Min(Address)原理是,它检索最早的 DateJoined 对应的地址。但是,如果我们交换原始表中的两个地址,我们将检索“123 FirstAddress Way”,它与加入的 1/1/2013 日期不对应。
对于几乎所有事情,您都可以使用简单的 groupby,但是由于您需要“与最小日期连接所在的行相同的地址”,这有点棘手,您可以通过多种方式解决它,一种是每次都搜索地址的子查询
SELECT
X.*,
(select Address
from #tmp t2
where t2.MemberID = X.memberID and
t2.DateJoined = (select MIN(DateJoined)
from #tmp t3
where t3.memberID = X.MemberID))
FROM
(select MemberID,
Name,
MIN(DateJoined) as DateJoined,
MAX(DateQuit) as DateQuit,
SUM(PointsEarned) as PointEarned
from #tmp t1
group by MemberID,Name
) AS X
Run Code Online (Sandbox Code Playgroud)
` 或者其他是带有 Join 的子查询
SELECT
X.*,
J.Address
FROM
(select
MemberID,
Name,
MIN(DateJoined) as DateJoined,
MAX(DateQuit) as DateQuit,
SUM(PointsEarned) as PointEarned
from #tmp t1
group by MemberID,Name
) AS X
JOIN #tmp J ON J.MemberID = X.MemberID AND J.DateJoined = X.DateJoined
Run Code Online (Sandbox Code Playgroud)