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)
我究竟做错了什么?我是在正确的轨道上吗?
正如错误消息所示,您正在使用一个需要数组的字符串.换句话说,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)
| 归档时间: |
|
| 查看次数: |
226 次 |
| 最近记录: |