CF百分比列的总和

时间:2016-04-05 14:44:07

标签: coldfusion coldfusion-10

我在创建我的百分比列的总和方面遇到了很多麻烦,这似乎很容易,因为它显示了所有分支时的100%。但我需要弄清楚所有分支都没有显示的时间等式。在下图中,每个分支百分比是根据处理的位置清单数除以检查表的总数来计算的。不幸的是我无法弄清楚如何只是"写"只需将百分比列的总和添加到总列中即可显示。任何帮助将不胜感激。

<cfset result = {} /> 
<cftry> 
    <cfquery datasource="#application.dsn#" name="GetLocationInfo">
        SELECT *
        FROM cl_checklists
    </cfquery>

    <cfquery name="allLocCode" dbtype="query">
        SELECT DISTINCT trans_location, COUNT(*) AS locationCount FROM GetLocationInfo Where trans_location is not null GROUP BY trans_location ORDER BY trans_location
    </cfquery>
    <cfcatch type="any"> 
        <cfset result.error = CFCATCH.message > 
        <cfset result.detail = CFCATCH.detail > 
    </cfcatch> 
</cftry> 
    <cfset columnSum = ArraySum(allLocCode['locationCount'])>
<table border="1" id="Checklist_Stats">
    <thead>
        <th><strong>Location</strong></th>
        <th><strong>Percent of Total Checklists</strong></th>
        <th><strong>Location Total</strong></th> 
    </thead>
    <tbody>
     <cfloop query="allLocCode">
      <cfset thisLocationName = trim(allLocCode.trans_location) />

      <cfquery name="allLocCodeForLocationQry" dbtype="query">
          SELECT trans_location,count(*) AS locCntr FROM GetLocationInfo WHERE trans_location='#thisLocationName#' GROUP BY trans_location ORDER BY trans_location
      </cfquery>
      <cfoutput query="allLocCodeForLocationQry">
      <tr>
        <td><strong>#thisLocationName#</strong></td>
        <td>#NumberFormat((allLocCodeForLocationQry.locCntr/columnSum) * 100, '9.99')#%</td>
        <td>#allLocCodeForLocationQry.locCntr#</td>
      </tr>
     </cfoutput>
     </cfloop>
        <cfdump var="#allLocCodeForLocationQry.locCntr#">
     <tr>
      <td><strong>Total</strong></td>
      <td></td>
      <td><cfoutput>#columnSum#</cfoutput></td>
    </tr>
    </tbody>
</table>

enter image description here

不确定如何得到这个总和:<td>#NumberFormat((allLocCodeForLocationQry.locCntr/columnSum) * 100, '9.99')#%</td>

2 个答案:

答案 0 :(得分:2)

您只需将计算出的百分比推送到数组,然后就可以得到这样的总和:

<!--- Define Array -->
<cfset checkListPercentage = arrayNew(1)>

<cfoutput query="allLocCodeForLocationQry">
  <cfset currentPercentage = allLocCodeForLocationQry.locCntr / columnSum * 100)>
  <cfset arrayAppend(checkListPercentage, currentPercentage)>
  <tr>
    <td><strong>#thisLocationName#</strong></td>
    <td>#numberFormat(currentPercentage, '9.99')#%</td>
    <td>#allLocCodeForLocationQry.locCntr#</td>
  </tr>
</cfoutput>

<!--- Get Total --->
<cfoutput>#arraySum(checkListPercentage)#</cfoutput>

答案 1 :(得分:0)

我在其中一个问题之前发布了一个类似的答案。这将为您提供所需的信息:

每次获得百分比时,都应将其设置为变量并将其添加到列表或数组中。作为这一段代码的一个例子:

 <cfloop query="allLocCode">
      <cfset thisLocationName = trim(allLocCode.trans_location) />
      <cfquery name="allLocCodeForLocationQry" dbtype="query">
          SELECT trans_location,count(*) AS locCntr FROM GetLocationInfo WHERE trans_location='#thisLocationName#' GROUP BY trans_location ORDER BY trans_location
      </cfquery>

      <cfset PercentageList = "">
      <cfset thisPercentage = #NumberFormat((allLocCodeForLocationQry.locCntr/columnSum) * 100, '9.99')#>
      <cfset PercentageList = ListAppend(PercentageList, thisPercentage, ',')>

      <cfoutput query="allLocCodeForLocationQry">
      <tr>
        <td><strong>#thisLocationName#</strong></td>
        <td>#thisPercentage#%</td>
        <td>#allLocCodeForLocationQry.locCntr#</td>
      </tr>
     </cfoutput>
 </cfloop>

在所有计算结束时,您应该有一个百分比列表。您可以包含此功能以将列表添加到一起。

<cfscript>
function listSum(listStr)
{
  var delim = ",";
  if(ArrayLen(Arguments) GTE 2) 
    delim = Arguments[2];
  return ArraySum(ListToArray(listStr, delim));
}
</cfscript>

所以你的最后一行是:

<tr>
  <td><strong>Total</strong></td>
  <td>#listSum(PercentageList)#%</td>
  <td><cfoutput>#columnSum#</cfoutput></td>
</tr>

值得一提的是:之前有人向我指出,在计算结束时使用数组和然后转换为List会带来更好的性能,因此需要保留一些东西心里。

ArraySum是相关的功能。

在其他循环和查询中包含所有循环和查询,我只是觉得创建一个列表更容易。

< - > E - 无法解释的downvotes不太好。