Ваш запрос не виноват.Вы пытаетесь выбрать из 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)
МЕСЯЦ теперь не требуется, поскольку он просто вставляется вмассив, который имеет дело с заказом