Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server根据另一个表中的条件查找值的总和_Sql Server - Fatal编程技术网

Sql server SQL Server根据另一个表中的条件查找值的总和

Sql server SQL Server根据另一个表中的条件查找值的总和,sql-server,Sql Server,我有一个由ID、年份、值组成的表 --------------------------------------- | ID | Year | Value | --------------------------------------- | 1 | 2006 | 100 | | 1 | 2007 | 200 | | 1 | 2008 | 15

我有一个由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循环的情况下生成第三个表的结果?

在按和分组的过程中,将只针对所讨论的ID-因为最小年份和最大年份是针对ID本身的,所以您不需要重复查询。下面的查询应该会提供您所需要的信息。如果你有不同的要求,请告诉我

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

您可以将您的条件放入联接中,并将结果作为一个集合获得,这应该更快:

SELECT b.Id, b.MinYear, b.MaxYear, sum(a.Value)
FROM Table2 b
JOIN Table1 a ON a.Id=b.Id AND b.MinYear <= a.Year AND b.MaxYear >= a.Year
GROUP BY b.Id, b.MinYear, b.MaxYear

您可以使用下面的查询 表A是您的第一张表,表B是第二张表

SELECT *,
(select SUM(Value) FROM TableA where tablea.ID=TableB.ID AND tableA.Year BETWEEN 
TableB.MinYear AND TableB.MaxYear) AS SumValue
from TableB

如果只有一个表(如示例数据),则不需要联接。仅分组和聚合。我遗漏了什么吗?对不起,你说得对,不需要加入。我无意中使用了术语join,因为我确实使用了一些其他数据对聚合表执行了join,但这超出了问题的范围。在建议的方法中,此方法似乎运行得最快,但我还有一个问题。如果我有不同的年份范围,而不仅仅是最小/最大范围,其中表1记录可以出现在多个范围内,即2012-2015年和2012-2018年,因此2012201320142015年将出现在这两个范围内,该解决方案仍然有效吗?