2016-04-04 5 views
1

Ich versuche, die Summe einer Spalte mit ColdFusion und MS Sql zu berechnen.CF Abrufen der Summe einer Spalte in einer Datenbankabfrage

Will mir bitte jemand sagen, was ich übersehe? Meine Summe für die Standortgesamtmenge macht nicht die Summe der Spalte, sondern nimmt nur die letzte Zahl in dieser Spalte. Wo gehe ich falsch?

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

    <cfcatch type="any"> 
     <cfset result.error = CFCATCH.message > 
     <cfset result.detail = CFCATCH.detail > 
    </cfcatch> 
</cftry> 

<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> 
    <cfquery name="allLocCode" dbtype="query"> 
     SELECT DISTINCT trans_location, COUNT(*) AS locationCount FROM GetLocationInfo GROUP BY trans_location ORDER BY trans_location 
    </cfquery> 
    <cfloop query="allLocCode"> 
     <cfset thisLocationName = trim(allLocCode.trans_location) /> 

     <cfquery name="allLocCodeForLocationQry" dbtype="query"> 
      SELECT trans_location,count(trans_location) AS locCntr FROM GetLocationInfo WHERE trans_location='#thisLocationName#' GROUP BY trans_location ORDER BY trans_location 
     </cfquery> 
     <cfset columnSum = ArraySum(allLocCodeForLocationQry['locCntr'])> 
     <cfoutput query="allLocCodeForLocationQry"> 
     <tr> 
     <td><strong>#thisLocationName#</strong></td> 
     <td>#NumberFormat((allLocCodeForLocationQry.locCntr/allLocCode.locationCount) * 100, '9.99')#%</td> 
     <td>#allLocCodeForLocationQry.locCntr#</td> 
     </tr> 
    </cfoutput> 
    </cfloop> 
    <tr> 
     <td><strong>Total</strong></td> 
     <td></td> 
     <td><cfoutput>#numberFormat(columnSum)#</cfoutput></td> 
    </tr> 
    </tbody> 
    <!--- Total of All Sum of each column ---> 
</table> 

enter image description here

+0

Sieht so aus, als ob Sie COUNT() in SQL verwenden können ... haben Sie SUM() versucht? – TRose

+0

Ich denke, vielleicht habe ich das in die falsche Richtung gesehen. Mein erster Instinkt besteht immer darin, vor der Verwendung von ColdFusion-Variablen mathematisch zu arbeiten und Daten in der Abfrage selbst zu ändern, aber das ist hier nicht ratsam. Schau dir meine Antwort unten an - ich denke, es wird für dich funktionieren. – TRose

Antwort

2

Ihre Variable ist in Ihrem cfloop. Setzen Sie die <cfset columnSum = ArraySum(allLocCodeForLocationQry['locCntr'])> Zeile außerhalb der cfloop (entweder vorher oder nachher), und Sie sollten Ihre Gesamtsumme von 334 erhalten.

1

bereits.

Jedes Mal, wenn Sie die Abfrage durchlaufen, hängen Sie einen Wert (die Anzahl der Standorte) an eine Liste an.

Etwas wie folgt aus:

<cfset myList = ""> 
<cfloop query="allLocCode"> 
<cfset myList = ListAppend(myList, locationCount, ',')> 

<!---your other logic---> 
</cfloop> 

Am Ende der Schleife sollten Sie eine Liste von Zahlen haben, solange Ihre Abfrage Record.

Sie können alle diese Nummern mit dieser alten Funktion, die ich in CFLib gefunden habe, addieren.

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

So zum Beispiel, wenn Sie Ihre endgültige Liste wurde myList genannt und hatte Werte wie 14, 100, 7 - Sie würden schreiben:

<cfoutput>#listSum(myList)#</cfoutput> 

Und Ihre endgültige Antwort von 121 bekommen.

+2

Wenn Sie eine Liste führen müssen, fügen Sie sie in ein Array ein und konvertieren Sie sie später in eine Liste. Viel performanter. –

+0

Ich nehme an, du hast Recht. Guter Fang. Ich war müde und versuchte nur die Logik zusammenzusetzen. – TRose

1

Da dies SQL-Server ist, warum nutzen Sie nicht die Möglichkeit, das Schlüsselwort with zu verwenden? Die allgemeine Idee ist dies:

with totalRecords as 
(select count(*) records 
from etc), 

groupedRecords as 
(select someField, count(*) recordsForField 
from etc 
group by someField) 

select whatevever 
, (groupedRecords.recordsForField/totalRecords.records) * 100 percentage 
from someTables 
join groupedRecords on groupedRecords.someField = someTable.someField 

where totalRecords.records > 0 

Dann geben Sie einfach Ihre Abfrageergebnisse aus.

Verwandte Themen