首页 > 解决方案 > SQL Server 根据另一个表中的条件查找值的总和

问题描述

我有一个由 ID、年份、值组成的表

---------------------------------------
|   ID     |     Year    |    Value   |
---------------------------------------
|   1      |     2006    |     100    |
|   1      |     2007    |     200    |
|   1      |     2008    |     150    |
|   1      |     2009    |     250    |
|   2      |     2005    |     50     |
|   2      |     2006    |     75     |
|   2      |     2007    |     65     |
---------------------------------------

然后我创建一个由 ID、MinYear 和 MaxYear 组成的派生聚合表

---------------------------------------
|   ID     |   MinYear   |   MaxYear  |
---------------------------------------
|   1      |     2006    |    2009    |
|   2      |     2005    |    2007    |
---------------------------------------

然后,我想在聚合表中找到 MinYear 和 MaxYear foreach ID 之间的值的总和,但我无法确定正确的查询。

决赛桌应该是这样的

----------------------------------------------------
|   ID     |   MinYear   |   MaxYear  |   SumVal   |
----------------------------------------------------
|   1      |     2006    |    2009    |     700    |
|   2      |     2005    |    2007    |     190    |
----------------------------------------------------

现在我可以执行所有连接来创建第二个表。但随后我使用快进游标遍历第二个表的每条记录,其中 for 循环内的代码如下所示

DECLARE @curMin int
DECLARE @curMax int
DECLARE @curID  int
FETCH Next FROM fastCursor INTo @curISIN, @curMin , @curMax 
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT Sum(Value) FROM ValTable WHERE Year >= @curMin and Year <= @curMax and ID = @curID
Group By ID
FETCH Next FROM fastCursor INTo @curISIN, @curMin , @curMax 

找到指定年份之间的值总和后,我可以将其连接回第二个表,然后得出所需的结果(第三个表)。

然而,实际上第二个表大约有 400 万行,所以这个迭代非常耗时(大约每分钟生成 300 个结果)并且可能不是最佳解决方案。

我的问题是,有没有一种方法可以生成第三个表的结果而不必使用游标/for 循环?

标签: sql-server

解决方案


在按总和的分组期间,仅针对相关 ID - 因为最小年份和最大年份针对 ID 本身,所以您不需要双重查询。下面的查询应该可以准确地为您提供所需的内容。如果您有不同的要求,请告诉我。

SELECT ID, MIN(YEAR) as MinYear, MAX(YEAR) as MaxYear, SUM(VALUE) as SUMVALUE
FROM tablenameyoudidnotsay
GROUP BY ID

推荐阅读