我有一个简单的问题。我尝试将coalesce
与group by
子句结合使用。我想在变量为null时得到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谢谢大家的帮助!我真的很感激!答案 0 :(得分:3)
您的查询没有错。您正尝试根据每个employee_id从ORDERS中进行选择。然后你循环它。
如果某个月没有订单,那么结果集中就没有行。
即使过去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)
MONTH现在没有必要,因为它只是插入处理排序的数组
答案 1 :(得分:0)
TRy ISNULL()而不是COALESCE。 COALESCE用于多个参数,如果不需要多个参数,则可以使用ISNULL
答案 2 :(得分:0)
尝试反转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。所以没有行的总和将为空。