sql-server - 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 循环?
解决方案
在按总和的分组期间,仅针对相关 ID - 因为最小年份和最大年份针对 ID 本身,所以您不需要双重查询。下面的查询应该可以准确地为您提供所需的内容。如果您有不同的要求,请告诉我。
SELECT ID, MIN(YEAR) as MinYear, MAX(YEAR) as MaxYear, SUM(VALUE) as SUMVALUE
FROM tablenameyoudidnotsay
GROUP BY ID
推荐阅读
- java - Java iText 将文档缩放到 A4
- c# - 需要勾选Datagridview C#中的复选框
- c# - 创建始终在后台运行的 Windows 窗体应用程序
- java - 我如何理解公共静态Objective []?
- javascript - 当我使用托管在 Heroku 上的 AWS 应用程序中的数据库部署我的反应节点时,“未找到”
- java - Java 8如何按枚举类型合并多个列表
- java - 如何使用可分页参数定义请求中的方向?
- angular - Angular - 在硬刷新时清除本地存储
- bash - 使用 $(...) 创建 Unix 别名不起作用
- angular - 按钮的 href 属性中的插值