在 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>.

执行聚合的解决方法代码