Как рассчитать сумму столбца - PullRequest
1 голос
/ 14 мая 2011

Я задавал подобные вопросы раньше, но не получил хороших ответов, возможно, потому что код был слишком длинным или мой вопрос был неясным. На этот раз я постараюсь сделать все возможное :) Пока что я написал код, чтобы найти из таблицы сумму строк, которая отлично работает:

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

Теперь я хочу найти сумму столбца. Код для столбца sum работает, но неверно. Подсчитывает сумму последнего продукта:

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

Я знаю, что я не зацикливал вывод столбца по идентификатору продукта, потому что, как только я зациклил его, он генерирует много <td>, что означает много несущественных данных. В чем здесь может быть ошибка?

Ответы [ 3 ]

16 голосов
/ 14 мая 2011

Если у вас есть столбец в вашем запросе, и вы можете гарантировать, что каждое значение будет числовым, вы также можете сделать:

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

Если оно встретит какие-либо нечисловые значения, это вызоветошибка, поэтому вам, вероятно, нужно поместить оператор coalesce вокруг этого поля или что-то в этом роде, чтобы все нулевые значения были преобразованы в ноль.

2 голосов
/ 14 мая 2011

За этим очень трудно следовать.

Некоторые предложения ....

Попробуйте сделать это в выражении 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 голосов
/ 01 марта 2018

В зависимости от типа данных столбца таблицы попробуйте это для более старых версий CF:

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