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

Coldfusion 如何防止CFLoop中相同CFQuery的多次迭代并将其格式化为矩阵,coldfusion,coldfusion-8,Coldfusion,Coldfusion 8,我对此做了很多研究,但还没有找到我想要的答案。我能够在一点帮助下达到这一点,但现在我又遇到了另一个障碍 我希望能够在最左边的一栏中显示所有唯一的公司名称,然后是特定月份内每种类型测试次数的“计数”。我已经注释掉了我的一些代码,虽然它可以工作,但没有考虑到当某个特定测试的数量等于零时,db中没有符合条件的记录,这是确保其他测试不会混淆“计数”所必需的。我的代码可能有助于详细说明: <cfset s = structNew()> <cfquery datasource="test"

我对此做了很多研究,但还没有找到我想要的答案。我能够在一点帮助下达到这一点,但现在我又遇到了另一个障碍

我希望能够在最左边的一栏中显示所有唯一的公司名称,然后是特定月份内每种类型测试次数的“计数”。我已经注释掉了我的一些代码,虽然它可以工作,但没有考虑到当某个特定测试的数量等于零时,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没有任何内容。所以我的陈述也有问题,但我不确定是什么。请理解我刚刚开始学习ColdFusion,我在这个页面上的大部分内容都是来自另一个不同论坛上另一种灵魂的帖子。我期待您的回复和输入,提前谢谢


PS quick edit:当我使用如上所述时,输出为1个完整查询,其中1个记录company=I,test_type=UA,2个查询,其中2个查询,3个查询,如果3个匹配记录,依此类推。最终,我希望此查询只为每个公司i运行一次,然后将s[i][j].recordcount拉到不等于0的位置,这样我就可以将其与不同的表(费用计划)进行比较,并根据执行的测试数量生成总金额,以向每个公司计费(如果有意义的话),但是我需要先越过这座桥。

如果我正确理解了你的问题,我会像下面这样重新组织查询

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

这听起来像是一份重点报告。如果您的数据库支持,您可以考虑使用sql pivot而不是在CF中构建它。1您使用的数据库类型和版本是什么?2有多少种测试类型?有固定数量的类型吗?顺便说一句,一定要在查询问题中包含db类型和版本。我的想法是一样的。我编辑了您的答案,使输出变量与您在查询中给出的名称相匹配。+1。是的,我打算下一步建议:但我不确定测试类型的数量是否固定。如果是这样的话,一个案例将非常好地工作——与pivot不同——语法与大多数数据库兼容。我想我没有足够的口碑什么的/@Miguel-F我不能批准你的编辑,所以我自己修复了。没问题。谢谢你更新你的答案。