Comment calculer la somme de la colonne
-
13-11-2019 - |
Question
J'ai déjà posé ce genre de question, mais je n'ai pas reçu de bonnes réponses, peut-être parce que le code était trop long ou que ma question n'était pas claire. Pour cette fois, j'essaierai de faire de mon mieux :) Jusqu'à présent, j'ai écrit du code pour trouver à partir d'un tableau la somme de la ligne, ce qui fonctionne bien:
<cfloop list="#product_id_list#" index="product_index">
<cfloop list="#month_list#" index="month_index">
<cfoutput query="GET_SALES_TOTAL">
<cfif AY eq month_index and product_id eq product_index>
<cfloop list="#type_index#" index="tt_index">
<cfset 'alan_#tt_index#_#month_index#_#product_index#' = evaluate(tt_index)>
</cfloop>
</cfif>
</cfoutput>
</cfloop>
</cfloop>
<cfset 'total_#ii_index#_#p_index#'=evaluate('total_#ii_index#_#p_index#') + #evaluate('alan_#ii_index#_#ddd_other#_#p_index#')#>
Maintenant, je veux trouver une somme de colonne. Le code de la somme de colonne fonctionne, mais mal. Cela compte la somme du dernier produit:
<cfloop list="#product_id_list#" index="product_index">
<cfloop list="#month_list#" index="month_index">
<cfoutput query="GET_SALES_TOTAL">
<cfif AY eq month_index and product_id eq product_index>
<cfloop list="#type_index#" index="tt_index">
<cfset 'alan2_#tt_index#_#month_index#_#product_index#' = evaluate(tt_index)>
</cfloop>
</cfif>
</cfoutput>
</cfloop>
</cfloop>
<cfset 'total2_#ddd_other#_#p_index#'=evaluate('total2_#ddd_other#_#p_index#') + #evaluate('alan2_#ii_index#_#ddd_other#_#p_index#')#>
La sortie pour la somme de ligne:
<cfloop list="#product_id_list#" index="p_index">
<cfloop list="#type_index#" index="kk_ind">
<td align="center">
<font color="##FF0000">#TLFormat(evaluate('total_#kk_ind#_#p_index#'),0)#</font>
</td>
</cfloop>
</cfloop>
et la sortie de la somme de la colonne:
<cfloop list="#month_list#" index="kk">
<td align="center">
<cfset satis_oran= evaluate('total2_#kk#_#p_index#')>
#evaluate(satis_oran)#
</td>
</cfloop>
Je sais que je n'ai pas bouclé la sortie de la colonne par ID de produit, car une fois que je l'ai bouclé, il génère beaucoup de <td>
'S, ce qui signifie beaucoup de données non pertinentes. Quelle peut être l'erreur ici?
La solution
C'est très difficile à suivre.
Quelques suggestions....
Essayez de le faire dans une instruction SQL
Vous pourrez peut-être simplement utiliser une instruction de groupe pour résumer toutes ces valeurs. Quelque chose comme...
select productindex
, datepart('yyyy', datecolumn) as year
, datepart('mm', datecolumn) as month
, sum(valcolumn) as valcolumnsum
from productinfo
group by productindex, datepart('yyyy', datecolumn), datepart('mm', datecolumn)
Sinon, tous les mois ou produits sont en fait dans la requête retournée, c'est OK. Vous pouvez toujours boucler sur les produits et des mois plus tard.
N'utilisez pas d'évaluation
Je crois comprendre que CF compile littéralement à la volée, ce qui est très lent. Si vous devez référencer un nom de variable, utilisez dynamiquement une portée et des supports. Si vous enregistrez réellement des déclarations à évaluer plus tard, il existe probablement des alternatives
N'utilisez pas de balises de police
Je n'ai pas utilisé d'étiquette de police depuis les 6 dernières années. Sauf si travailler sur un code hérité en dépendant, la balise de police ne doit pas être utilisée.
Autres conseils
Si vous avez une colonne dans votre requête et que vous pouvez vous assurer que chaque valeur sera numérique, vous pouvez également faire:
<cfset sum = arraySum(queryname['column'])>
S'il rencontre cependant des valeurs non numériques, cela entraînera une erreur, vous devez donc probablement mettre une déclaration de fusion autour de ce champ ou quelque chose pour vous assurer que des valeurs nulles sont converties en zéro.
Selon le type de données de la colonne de table, essayez ceci pour les anciennes versions CF:
<cfset theSum = ArraySum(ListToArray(ValueList(queryName.column))) />