在查询循环中生成总计

Bri*_*man 1 coldfusion cfquery cfloop

我有一个简单的查询,它通过ID来提取记录列表:

<cfquery name="resTotals" datasource="#datasource#">
   SELECT ticket_id
   FROM   closed_tickets
   WHERE  YEAR(closed_date) = '2017' 
   AND    ticket_type = 'residential' 
</cfquery>
Run Code Online (Sandbox Code Playgroud)

然后我尝试在另一个不同表的查询中循环访问这些ID,以便检查是否存在付款记录.目标是总计所有支付记录,以获得支付美元的总金额.

我有这个查询,但它抛出一个错误:不能将字符串[99.00]转换为类型[数组]的值

<cfloop query="resTotals">
     <cfquery name="resPaymentTotals" datasource="#datasource#">
        SELECT payment_amount
        FROM   payments
        WHERE  ticket_id = #resTotals.ticket_id#
     </cfquery>

 </cfloop>

 Amount of Sales: $ #ArraySum(resPaymentTotals.payment_amount)#
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?我是在正确的轨道上吗?

Age*_*eax 5

正如错误消息所示,您正在使用一个需要数组的字符串.换句话说,ArraySum()需要一个数组,但是你传入一个字符串.从技术上讲,查询列是幕后的一个数组,但显然ArraySum并不是设计用于那样对待它.在这种情况下,CF视为resPaymentTotals.payment_amountpayment_amount列中第1个值的快捷方式,这是一个简单的值,而不是数组.

虽然您可以使当前代码工作,但在循环内查询效率非常低.你真正需要的是一个JOIN,而不是一个循环.要在单个查询中计算总数 - 每个ticket_id - :

<cfquery>
SELECT ct.ticket_id, SUM(p.payment_amount) AS TotalSales
FROM   closed_tickets ct LEFT JOIN payments p ON ct.ticket_id = p.ticket_id
WHERE  ct.closed_date >= '2017-01-01'
AND    ct.closed_date < '2018-01-01'
AND    ct.ticket_type = 'residential'
GROUP BY ct.ticket_id
</cfquery>
Run Code Online (Sandbox Code Playgroud)

如果您想要所有票证的总计,只需从SELECT中省略ticket_id.

<cfquery>
SELECT  SUM(p.payment_amount) AS TotalSales
FROM   closed_tickets ct LEFT JOIN payments p ON ct.ticket_id = p.ticket_id
WHERE  ct.closed_date >= '2017-01-01'
AND    ct.closed_date < '2018-01-01'
AND    ct.ticket_type = 'residential'
</cfquery>
Run Code Online (Sandbox Code Playgroud)