我将三个查询捆绑在一起。最终输出需要对查询进行多次循环。这种方式效果很好,但在我看来似乎效率很低而且太复杂。这是我所拥有的:
查询1:
<cfquery name="qryTypes" datasource="#application.datasource#">
SELECT
t.type_id,
t.category_id,
c.category_name,
s.type_shortcode
FROM type t
INNER JOIN section s
ON s.type_id = t.type_id
INNER JOIN category c
ON c.category_id = t.category_id
WHERE t.rec_id = 45 -- This parameter is passed from form field.
ORDER BY s.type_name,c.category_name
</cfquery>
查询类型将产生以下结果:
4 11 SP PRES
4 12 CH PRES
4 13 MS PRES
4 14 XN PRES
然后遍历查询类型,并为每个匹配的记录从另一个查询中获取记录:
查询2:
<cfloop query="qryTypes">
<cfquery name="qryLocation" datasource=#application.datasource#>
SELECT l.location_id, l.spent_amount
FROM locations l
WHERE l.location_type = '#trim(category_name)#'
AND l.nofa_id = 45 -- This is form field
AND l.location_id = '#trim(category_id)##trim(type_id)#'
GROUP BY l.location_id,l.spent_amount
ORDER BY l.location_id ASC
</cfquery>
<cfset spent_total = arraySum(qryLocation['spent_amount']) />
<cfset amount_total = 0 />
<cfloop query="qryLocation">
<cfquery name="qryFunds" datasource=#application.datasource#>
SELECT sum(budget) AS budget
FROM funds f
WHERE f.location_id= '#qryLocation.location_id#'
AND nofa_id = 45
</cfquery>
<cfscript>
if(qryFunds.budgetgt 0) {
amount_total = amount_total + qryFunds.budget;
}
</cfscript>
</cfloop>
<cfset GrandTotal = GrandTotal + spent_total />
<cfset GrandTotalad = GrandTotalad + amount_total />
</cfloop>
循环完成后,结果如下:
CATEGORY NAME SPENT TOTAL AMOUNT TOTAL
SP 970927 89613
CH 4804 8759
MS 9922 21436
XN 39398 4602
Grand Total: 1025051 124410
是否有一个很好的方法可以将其合并在一起,并且只有一个查询而不是三个查询和内部循环?我想知道这是否适合存储过程,然后在那里进行所有数据操作?如果有人有建议,请告诉我。
答案 0 :(得分:4)
ldd
返回X条记录qryTypes
返回Y记录到目前为止,您已经运行(1 + X)个查询。
qryLocation
返回Z记录现在您已经运行(1 + X)(Y)个查询。
每个返回的数据越多,您将运行的查询越多。显然不好。
如果您想要的只是每个类别的最终总数,则在存储过程中,您可以创建一个临时表,其中包含来自qryFunds
和qryTypes
的联接数据。然后,将最后一个qryLocation
与该临时表数据连接在一起。
qryFunds
如果需要,您可以从临时表中获取其他总和。可能所有这些都可以处理成一个查询,但这也许可以帮助您到达那里。
此外,存储过程可以返回多个记录集,因此您可以让一个返回聚合表数量数据,第二个返回总计。这样可以将所有计算保留在数据库中,而无需涉及CF。