如何防止CFLoop中相同CFQuery的多次迭代并格式化为矩阵

时间:2013-02-04 19:43:56

标签: coldfusion coldfusion-8

我对此进行了相当多的研究,并没有找到我正在寻找的答案。我能够在一点帮助下达到这一点,但现在又陷入了另一个障碍。

我希望能够在最左边的列中显示所有UNIQUE公司名称,然后在特定月份内显示每种类型的测试数量的“总计”。我已经注释掉了一些我的代码,虽然它有效,却没有考虑到特定测试的数量何时等于零(db中没有符合条件的记录),如果没有别的话,这是必需的。确保其他测试不会让他们的“标签”混淆。我的代码可能有助于详细说明:

<cfset s = structNew()>
<cfquery datasource="test" name="qry">
    SELECT company, test_type, count(test_type) as counter 
    FROM donor_log
    GROUP BY company, test_type
</cfquery>

<cfloop query="qry">
    <cfset s[qry.company][qry.test_type] = qry.counter>
</cfloop>

<table border="1">
    <tr>
        <th>Company</th>
        <th>UA</th>
        <th>BA</th>
        <th>Hair</th>
        <th>Blood</th>
    </tr>
    <cfoutput>
    <cfloop collection="#s#" item="i">
        <tr>
            <td>#i#</td>
            <cfloop collection="#s[i]#" item="j">
                <cfquery dbtype="query" name="ua">
                    SELECT DISTINCT company 
                    FROM qry 
                    WHERE company='#i#' 
                      AND test_type='UA'
                </cfquery>
                <cfdump var="#ua#"> 
                <!---
                <cfif val(s[i][j]) EQ 0>
                    <td>0</td>
                <cfelse>  
                    <td>#s[i][j]#</td>
                </cfif>
                 --->
            </cfloop>  
        </tr>
    </cfloop> 
    </cfoutput>

structKey值等于0时,评论部分不会向屏幕打印'0',而目前,如果公司有0 UA但是2 BA,则UA下的单元表示2和BA没什么。所以我的<cfif>声明也有问题,但我不确定是什么。请理解我刚开始学习ColdFusion,我在这个特定页面上的大部分内容都是来自另一个论坛的另一个灵魂的帖子。我期待您的回复和意见,提前谢谢!

PS快速编辑:当我使用上面的<cfdump>时,对于具有1个这样的记录company="#i#" AND test_type="UA"的公司,输出是1个完整查询,对具有2个这样的记录的公司的2个查询,3个查询如果有3个匹配的记录,依此类推。最终希望此查询仅针对每个公司"#i#"运行ONCE,然后拉s[i][j].recordcount(无论它何时不等于0),以便我可以将其与不同的表进行比较(费用表)并根据所执行的测试数量生成总额以对每家公司收费,如果这是有道理的,但我需要先跨过这座桥。

1 个答案:

答案 0 :(得分:2)

如果我正确理解您的问题,我只需重新组织查询,如下所示

<cfquery datasource="test" name="qry">
SELECT company, SUM(CASE WHEN test_type = 'UA' THEN 1 ELSE 0 END) AS UACount
, SUM(CASE WHEN test_type = 'BA' THEN 1 ELSE 0 END) AS BACount
, SUM(CASE WHEN test_type = 'Hair' THEN 1 ELSE 0 END) AS HairCount
, SUM(CASE WHEN test_type = 'Blood' THEN 1 ELSE 0 END) AS BloodCount
FROM donor_log
GROUP BY company
</cfquery>

然后输出

<table border="1">
<tr>
    <th>Company</th>
    <th>UA</th>
    <th>BA</th>
    <th>Hair</th>
    <th>Blood</th>
</tr>
<cfoutput query="qry">
 <tr>
  <td>#qry.Company#</td>
  <td>#qry.UACount#</td>
  <td>#qry.BHCount#</td>
  <td>#qry.HairCount#</td>
  <td>#qry.BloodCount#</td>
 </tr>
</cfoutput>