让我们考虑第一个查询:
SELECT r.cnum as cnum, c.name as name, r.assets as assets
FROM research..complex c, research..retirement_simple_ira r
where r.date = '9/30/2016'
and c.cnum = r.cnum
ORDER BY cnum
这给了我们一个结果集,如下所示:
这是我的第二个查询:
SELECT cf.cnum, SUM(rs.dh_simple + rs.ha_simple) as sums
FROM retirement_survey as rs
INNER JOIN currentfunds as cf
ON rs.fundid = cf.fundid
WHERE rs.date = '9/30/2016'
GROUP BY cf.cnum
HAVING SUM(rs.dh_simple + rs.ha_simple) > 0
我尝试合并这两个查询,以便得到一个列出 4 列的结果集:
数字 | 姓名 | 资产 | 总和
这是我的尝试:
SELECT cf.cnum as cnum, c.name as name, r.assets as assets, SUM(rs.dh_simple + rs.ha_simple) as sums
FROM research..complex c, research..retirement_simple_ira r, retirement_survey as rs
INNER JOIN currentfunds as cf
ON rs.fundid = cf.fundid
WHERE rs.date = '9/30/2016'
HAVING SUM(rs.dh_simple + rs.ha_simple) > 0
那就是我收到错误的时候。我做错了什么?
FWIW ...如果您(仍然)不确定为什么原始(组合)查询会产生溢出错误...请考虑:
缺少连接子句意味着您的查询在 c/r/cf 表之间生成笛卡尔积(即,生成的连接记录比您想要的要多得多)。
缺少的 'group by' 子句意味着 sum() 被应用于大量(笛卡尔积)连接记录;并且正如 Henrico 所建议的那样, sum() 认为它正在使用整数数据类型,因此 sum() 结果被假定为整数;Sybase 的整数数据类型的最大值为 2B,因此当 sum()(没有“分组依据”;应用于大规模笛卡尔积)达到 2B 以上时,您会得到溢出错误。
您的最新查询包括第一次尝试中缺少的那些部分(联接、“分组依据”),因此您不再生成溢出错误。(“呃,马克!”?)
我怀疑您的 SUM(rs.dh_simple + rs.ha_simple) 是 INT,在进行 SUM 之前尝试将两者都转换为 BIGINT/FLOAT/DECIMAL。
INT 最大大小 = 2,147,483,647
但来自 MS 的警告:当您使用 +、-、*、/ 或 % 算术运算符执行 int、smallint、tinyint 或 bigint 常量值到浮点、实数、小数或数字数据类型的隐式或显式转换时, SQL Server 在计算表达式结果的数据类型和精度时应用的规则取决于查询是否自动参数化。
尝试:
经过大量的试验和错误,这似乎终于奏效了!
虽然它非常慢,并且需要索引,因为其中一个表实际上是一个视图......但现在应该可以工作了:)