coalesce не работает при использовании группировки - PullRequest
1 голос
/ 17 февраля 2012

У меня простой вопрос. Я пытаюсь использовать coalesce в сочетании с предложением group by. Я хочу получить 0 значений, когда переменная равна нулю. Вот мой код сервера sql:

SELECT SUM(COALESCE(NETTOTAL,0)) AS NETTOTAL,DATEPART(MM,RECORD_DATE) MONTH 
FROM ORDERS WHERE ORDER_EMPLOYEE_ID=#attributes.record_emp_id# 
GROUP BY DATEPART(MM,RECORD_DATE) ORDER BY MONTH

.. и мой вывод:

<tr height="20">
    <td>Orders</td>
    <cfoutput query="get_orders"><td style="text-align:center;">#tlformat(nettotal,2)# - #month#</td></cfoutput>
</tr>

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

http://i.stack.imgur.com/VIAmr.png

Чтобы было понятнее, я добавил номер месяца. Как видите, порядок нарушен, поскольку в остальные месяцы нулевых значений нет ...

P.S. Спасибо всем за помощь! я действительно ценю это!

Ответы [ 3 ]

3 голосов
/ 17 февраля 2012

Ваш запрос не виноват.Вы пытаетесь выбрать из ORDERS на основе каждого employee_id.Затем вы зацикливаетесь на этом.

Если в данном месяце нет заказов, то в наборе результатов не будет строки для него.

Даже если в течение последних 4 месяцев были только заказы, они были бы перенесены в первые 4, поскольку вы не проверяете, совпадает ли текущий месяц с заголовком столбца.

Длянемного метакода, я бы пошел по этому пути

1 - создайте массив следующим образом

arrMonths= [
    {orders=0,sales=0},
    {orders=0,sales=0}....
]

Это даст вам stc, который вы можете повторить позже.

2 - я бы затем зациклился на каждом запросе

<cfoutput query="get_orders">
    <cfset arrMonths[month].orders = nettotal>
</cfoutput>

3 - я бы потом перебрал массив

<tr height="20">
    <td>Orders</td>
    <cfoutput from="1" to="#ArrayLen(arrMonths)#" index="thisMonth">
        <td style="text-align:center;">#tlformat(arrMonths[thisMonth].orders,2)# - #thisMonth#</td>
    </cfoutput>
</tr>

Таким образом, каждый месяц ВСЕГДА будет иметь значение, даже если он0. Вы также можете исключить объединение, поскольку простой факт, что строки без заказов не имеют записей, означает, что по умолчанию они равны 0, поэтому ваш запрос может стать

SELECT 
    SUM(COALESCE(NETTOTAL)) AS NETTOTAL,
    DATEPART(MM,RECORD_DATE) MONTH 
FROM ORDERS 
WHERE ORDER_EMPLOYEE_ID=<cfqueryparam cfsqltype="cf_sql_integer" value="#attributes.record_emp_id#">
GROUP BY DATEPART(MM,RECORD_DATE)

МЕСЯЦ теперь не требуется, поскольку он просто вставляется вмассив, который имеет дело с заказом

0 голосов
/ 17 февраля 2012

Попробуйте инвертировать порядок функций Sum и Coalesce.IsNull также может быть более читабельным:

SELECT   IsNull(SUM(NETTOTAL), 0) AS NETTOTAL,
         DATEPART(MM, RECORD_DATE) MONTH 
FROM     ORDERS
WHERE    ORDER_EMPLOYEE_ID = #attributes.record_emp_id# 
GROUP BY DATEPART(MM, RECORD_DATE)
ORDER BY MONTH

Если нет элементов NETTOTAL, Coalesce из вашего кода не будет вызыватьсяТаким образом, сумма строк не будет равна нулю.

0 голосов
/ 17 февраля 2012

TRY ISNULL () вместо COALESCE.COALESCE используется для нескольких аргументов, если несколько аргументов не нужны, вы можете использовать ISNULL

...