使用分组时,coalesce不起作用

时间:2012-02-17 10:04:13

标签: coldfusion group-by sum coalesce

我有一个简单的问题。我尝试将coalescegroup 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谢谢大家的帮助!我真的很感激!

3 个答案:

答案 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。所以没有行的总和将为空。