在 QoQ 中使用求和函数时出现意外错误
Unexpected error using the sum function in a QoQ
尝试运行以下代码时
<cfquery name="Lev1CatTotal" dbtype="query">
SELECT
SUM(AMOUNT) AS TOTAL
FROM
ChartData
</cfquery>
这是生成的错误消息:
查询中的查询 运行时间错误。聚合函数 [SUM(expression)] 不能对 [JAVA_OBJECT]
类型的操作数进行运算
此代码在聚合较小的金额时工作正常。但是,这些是我汇总的 table 中的金额。这个特定的查询总计超过 $5.7B。
AMOUNT
FISCAL_YR
GOV_LEVEL1_CAT
979241575.14
2019
Charges for Services
97218277.18
2019
Charges to Other Governments
233197655.52
2019
Federal Aid
329567996.81
2019
Other Local Revenues
86957092.75
2019
Other Non-Property Taxes
158997846.75
2019
Other Real Property Tax Items
371012673.89
2019
Other Sources
346575244.01
2019
Proceeds of Debt
1145011131.99
2019
Real Property Taxes and Assessments
945308275.55
2019
Sales and Use Tax
921087680.04
2019
State Aid
107357596.20
2019
Use and Sale of Property
为了继续前进,作为一种解决方法,我将其重新编码如下:
<cfset TOTAL = 0>
<cfloop query="ChartData">
<cfset TOTAL = precisionEvaluate(TOTAL + AMOUNT)>
</cfloop>
使用precisionEvaluate()
,它将TOTAL
转换为BigDecimal
精度并避免了错误。有人知道 QoQ 解决方案使用 sum()
函数将其转换为大的小数并避免使用此解决方法吗?谢谢。
非常感谢@BernhardDöbler 让我了解 ChartData 的来源。由于这是继承的代码,因此我不得不对此进行调查。原来 ChartData 是用下面这行代码创建的。
<cfset ChartData = QueryNew("FISCAL_YR, GOV_LEVEL1_CAT, AMOUNT")>
我注意到,原来的编码器没有为他的 QueryNew()
语句指定任何数据类型,所以我将代码行修改为
<cfset ChartData = QueryNew("FISCAL_YR, GOV_LEVEL1_CAT, AMOUNT", "VarChar, VarChar, Double")>
一旦我将 Double
数据类型添加到 AMOUNT
列,当我恢复到
的原始代码时它纠正了错误
<cfquery name="Lev1CatTotal" dbtype="query">
SELECT
SUM(AMOUNT) AS TOTAL
FROM
ChartData
</cfquery>
并且我能够删除使用 <cfloop>
.
执行聚合的解决方法代码
尝试运行以下代码时
<cfquery name="Lev1CatTotal" dbtype="query">
SELECT
SUM(AMOUNT) AS TOTAL
FROM
ChartData
</cfquery>
这是生成的错误消息:
查询中的查询 运行时间错误。聚合函数 [SUM(expression)] 不能对 [JAVA_OBJECT]
类型的操作数进行运算此代码在聚合较小的金额时工作正常。但是,这些是我汇总的 table 中的金额。这个特定的查询总计超过 $5.7B。
AMOUNT | FISCAL_YR | GOV_LEVEL1_CAT |
---|---|---|
979241575.14 | 2019 | Charges for Services |
97218277.18 | 2019 | Charges to Other Governments |
233197655.52 | 2019 | Federal Aid |
329567996.81 | 2019 | Other Local Revenues |
86957092.75 | 2019 | Other Non-Property Taxes |
158997846.75 | 2019 | Other Real Property Tax Items |
371012673.89 | 2019 | Other Sources |
346575244.01 | 2019 | Proceeds of Debt |
1145011131.99 | 2019 | Real Property Taxes and Assessments |
945308275.55 | 2019 | Sales and Use Tax |
921087680.04 | 2019 | State Aid |
107357596.20 | 2019 | Use and Sale of Property |
为了继续前进,作为一种解决方法,我将其重新编码如下:
<cfset TOTAL = 0>
<cfloop query="ChartData">
<cfset TOTAL = precisionEvaluate(TOTAL + AMOUNT)>
</cfloop>
使用precisionEvaluate()
,它将TOTAL
转换为BigDecimal
精度并避免了错误。有人知道 QoQ 解决方案使用 sum()
函数将其转换为大的小数并避免使用此解决方法吗?谢谢。
非常感谢@BernhardDöbler 让我了解 ChartData 的来源。由于这是继承的代码,因此我不得不对此进行调查。原来 ChartData 是用下面这行代码创建的。
<cfset ChartData = QueryNew("FISCAL_YR, GOV_LEVEL1_CAT, AMOUNT")>
我注意到,原来的编码器没有为他的 QueryNew()
语句指定任何数据类型,所以我将代码行修改为
<cfset ChartData = QueryNew("FISCAL_YR, GOV_LEVEL1_CAT, AMOUNT", "VarChar, VarChar, Double")>
一旦我将 Double
数据类型添加到 AMOUNT
列,当我恢复到
<cfquery name="Lev1CatTotal" dbtype="query">
SELECT
SUM(AMOUNT) AS TOTAL
FROM
ChartData
</cfquery>
并且我能够删除使用 <cfloop>
.