2016-04-05 4 views
1

Ich habe viel Mühe beim Erstellen der Summe meiner Prozent Spalte, die scheint, als wäre es einfach, da es 100% ist, wenn alle Zweige angezeigt werden. Aber ich muss die Gleichung für die Zeiten herausfinden, in denen alle Zweige nicht gezeigt werden. In der Abbildung unten wird jeder Verzweigungsprozentsatz anhand der Anzahl der von diesen Standorten verarbeiteten Checklisten berechnet, dividiert durch die Gesamtzahl der Checklisten. Leider kann ich nicht herausfinden, wie man einfach "schreibt", indem man einfach die Summe der prozentualen Spalte hinzufügt und in der gesamten Spalte anzeigt. Jede Hilfe würde sehr geschätzt werden.CF-Summe der Prozentspalte

<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

nicht sicher, wie ich die Summe dieses nicht erhalten: <td>#NumberFormat((allLocCodeForLocationQry.locCntr/columnSum) * 100, '9.99')#%</td>

Antwort

2

Sie können einfach den berechneten Prozentsatz auf ein Array schieben und dort von Ihnen die Summe wie folgt zu erreichen:

<!--- 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> 
+0

Dies ist, was ich versuche zu vermitteln, aber einfacher und effizienter zu gestalten. @Beginner ist wahrscheinlich eher wie Experte. – TRose

+0

das löst es im Grunde nur, wie zeige ich die 2 Dezimalpunkte? Können Sie gleichzeitig Zahlenformat und Arraysum verwenden? –

+0

@DavidBrerton ja, du kannst. – Beginner

0

ich vor einem dieser Fragen eine ähnliche Antwort gepostet habe. Diese werden Sie bekommen, wo Sie sein müssen:


Jedes Mal, wenn Sie einen bestimmten Prozentsatz zu erhalten, sollten Sie es als eine Variable gesetzt und in eine Liste oder ein Array hinzuzufügen. Als ein Beispiel für dieses Stück Code:

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

Am Ende all Ihrer Berechnungen sollten Sie eine Liste von Prozentsätzen haben. Sie können diese Funktion hinzufügen, um die Liste zusammenzufügen.

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

So Ihre letzte Reihe wäre:

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

Erwähnenswert: Früher war es mir darauf hingewiesen, dass Arrays und dann Umwandlung in eine Liste am Ende Ihrer Berechnungen Ergebnisse mit in besserer Leistung, so dass es etwas zu beachten ist.

ArraySum ist die relevante Funktion dafür.

Mit all den Schleifen und Abfragen in anderen Schleifen und Abfragen, ich dachte nur, das Erstellen einer Liste war ein wenig einfacher.

E - unerklärliche Downvotes sind nicht nett.