多列分组没有使用cfoutput / cfloop使用聚合函数或组?

时间:2013-03-12 20:18:30

标签: sql-server coldfusion coldfusion-8

我还在学习如何以我想要的方式从查询中获取我的结果组。我在网上看过几十个例子,但都不符合我的需求。我正在寻找一种最直接的方法来从表中提取具有特定日期范围的一组记录,按公司名称对它们进行子过滤,然后通过test_type字段的计数对这些记录进行子过滤。它需要是动态的(在测试类型上是非动态的;那些是设置的并且不会改变),因为公司的数量在不断增长。这个问题非常类似于我在一个月前发布的另一个问题,现在我需要进一步(超 - ?)按服务日期过滤我的结果(字段名称'dos')。这是我现在的代码(非工作;带有“donor_log.company”的错误在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。“)。

<cfquery name="invall" datasource="test">
SELECT company,dos, 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 = 'Bld' THEN 1 ELSE 0 END) AS BldCount,
    SUM(CASE WHEN test_type = 'DNA' THEN 1 ELSE 0 END) AS DNACount,
    SUM(CASE WHEN test_type = 'Pat' THEN 1 ELSE 0 END) AS PatCount,
    SUM(CASE WHEN test_type = 'Phys' THEN 1 ELSE 0 END) AS PhysCount,
    SUM(CASE WHEN test_type = 'Obs' THEN 1 ELSE 0 END) AS ObsCount
FROM donor_log
    WHERE dos BETWEEN '2013-03-01' AND '2013-03-13'
    GROUP BY dos
    ORDER BY dos DESC   
</cfquery>

<table border="1">
<tr>

    <th>Company</th>
    <th>UA</th>
    <th>Obs. UA</th>
    <th>BA</th>
    <th>Hair</th>
    <th>Blood</th>
    <th>DNA</th>
    <th>Pat.</th>
    <th>Phys.</th>
</tr>
<cfoutput query="invall" group="dos">
    #dateformat(invall.dos,"mm-dd-yyyy")#
<tr>

    <td>#invall.company#</td>
    <td>#invall.UACount#</td>
    <td>#invall.ObsCount#</td>
    <td>#invall.BACount#</td>
    <td>#invall.HairCount#</td>
    <td>#invall.BldCount#</td>
    <td>#invall.DNACount#</td>
    <td>#invall.PatCount#</td>
    <td>#invall.PhysCount#</td>
</tr>
</cfoutput>
</table>

我知道它不是公司过滤的,因为它不喜欢select语句中的两个非聚合列,但我想知道如何改变它以获得类似的东西(这个'网页'是一个发票我们各种客户的摘要页面,但供我们参考,而不是实际开出账单):

    03-13-2013
           UA    BA    HAIR    BLD  (ETC...)
COMPANY A   3     2     0       0
COMPANY B   1     0     0       0
COMPANY C   2     4     0       0

    03-12-2013
           UA    BA    HAIR    BLD
COMPANY A   1     0     0       0
COMPANY C   2     1     1       0

    03-11-2013
           UA    BA    HAIR    BLD
COMPANY B   1     1     1       0
COMPANY D   4     2     2       1

...依此类推,直至2013年1月3日。我已经在不同的页面上安装了代码,我可以重复使用它以允许根据最终用户的偏好选择动态日期,因此March日期是任意的。我应该在这里使用子查询吗?以不同的方式/置换使用cfoutput / cfloop?期待您的回复和提前感谢,一如既往! :)

PS:使用ColdFusion 8和SQL Server 2005。

2 个答案:

答案 0 :(得分:0)

您可以采用的只是HTML操作的方法可以为您提供类似的结果而不会过于沉重:

<cfset variables.lastDate="">


<table border="1">
<tr>

    <th>Company</th>
    <th>UA</th>
    <th>Obs. UA</th>
    <th>BA</th>
    <th>Hair</th>
    <th>Blood</th>
    <th>DNA</th>
    <th>Pat.</th>
    <th>Phys.</th>
</tr>
<cfoutput query="invall">
<cfif not invall.dos is variables.lastdate>
    <tr><td colspan=9>#dateformat(invall.dos,"mm-dd-yyyy")#</td></tr>
</cfif>
<tr>

    <td>#invall.company#</td>
    <td>#invall.UACount#</td>
    <td>#invall.ObsCount#</td>
    <td>#invall.BACount#</td>
    <td>#invall.HairCount#</td>
    <td>#invall.BldCount#</td>
    <td>#invall.DNACount#</td>
    <td>#invall.PatCount#</td>
    <td>#invall.PhysCount#</td>
</tr>
<Cfset variables.lastdate=invall.dos>
</cfoutput>
</table>

我过去曾使用类似的样本,但分组并不实用。

答案 1 :(得分:0)

您实际上非常接近cfoutput的group属性。你刚刚完成了你的开始。我想你可能想要这样的东西。

<cfoutput query="invall" group="dos">
    output data for this grouping
    <cfoutput group="company">
        output data for this grouping
        <cfoutput>
            output ungrouped data
        </cfoutput>
    </cfoutput>
</cfoutput>

您的查询必须由dos desc,公司订购。