2011-05-14 71 views
1

我之前問過這類問題,但沒有收到任何好的答案,也許是因爲代碼太長或者我的問題不清楚。對於這段時間我會盡量做到最好:)到目前爲止,我已經寫代碼從表中的行之和,工作正常地發現:如何計算列數

<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#')#> 

現在我想找到一列總和。列總和的代碼工作,但不正確。它計算的最後一個產品的總和:

<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#')#> 

輸出爲行之和:

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

和輸出列求和:

<cfloop list="#month_list#" index="kk"> 
<td align="center"> 
    <cfset satis_oran= evaluate('total2_#kk#_#p_index#')> 
    #evaluate(satis_oran)# 
</td> 
</cfloop> 

我知道,我沒有」 t循環產品ID的列輸出,因爲一旦我循環它,它會產生很多<td>'s,這意味着很多不相關的數據。這裏有什麼錯誤?

回答

2

這很難遵循。

一些建議....

嘗試做這在SQL語句

你可以簡單地使用GROUP語句來概括所有這些值。類似...

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) 

如果不是所有的月份或產品實際都在返回的查詢中,那就沒問題。您仍然可以在幾個月後循環使用產品。

不要使用評估

這是我的理解是CF簡直是編制上,這是非常緩慢的飛行。如果您需要動態引用變量名稱,請使用範圍和括號。如果你實際上是節省報表進行評估後也有可能替代

不要使用字體標籤

我沒有可能是過去6年使用的字體標記。除非依賴於某些遺留代碼,否則不應使用字體標籤。

+0

沒有這樣valcolumn ColdFusion的 – user745110 2011-05-16 06:50:10

+0

valcolumn就是一個例子列名不字面! 在SQL中執行此操作的性能也會更高。我會在你的查詢上做更多的工作,按照productid分組,然後在月份裏得到你的循環......把所有的努力工作放回到它設計的db。 – Dawesi 2018-03-04 22:58:02

13

如果你在你的查詢中的列,並且可以保證每個值將是數字的,你也可以這樣做:

<cfset sum = arraySum(queryname['column'])> 

如果遇到任何非數字值,雖然,它會導致錯誤,因此您可能需要在該字段或其他位置放置合併語句以確保將任何空值轉換爲零。

+3

或'arrayum(valuearray(queryname.column))'(特別是如果您使用Railo)。 – 2013-05-02 21:52:28

0

根據表列的數據類型嘗試一下本作舊的CF版本:

<cfset theSum = ArraySum(ListToArray(ValueList(queryName.column))) />