2012-02-17 61 views
1

我有一個簡單的問題。我正在嘗試將​​3210與group by子句結合使用。當變量爲null時,我想獲得0個值。這是我的SQL Server代碼:當使用分組時,合併不起作用

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

如果你在SQL服務器上運行它,你會得到什麼? – Schiavini 2012-02-17 10:07:39

+0

@Schiavini還有一個截圖,看看它吧 – user745110 2012-02-17 10:09:43

+0

這是從coldfusion,不是從SQL Server管理工作室 – Schiavini 2012-02-17 10:12:26

回答

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) 

一個月,現在沒有必要的,因爲它只是插入與交易的陣列訂購

+0

謝謝西蒙,我知道它已經:)所以你是什麼?建議?那麼我該如何編寫它,這樣如果null值就會有零值? – user745110 2012-02-17 11:20:26

+0

更新了更完整的解決方案,這就是我反正使用的那種方法,所以希望它有幫助。您的表格數據來自Coldfusion數組,每個表格單元的默認值爲0。隨後,您可以隨時填寫查詢中有數據庫記錄的任何數據庫記錄。 – 2012-02-17 11:26:13

+0

謝謝你,我會試試這個:) – user745110 2012-02-17 11:26:39

0

TRy ISNULL()而不是COALESCE。 COALESCE用於多個參數如果不需要多個參數,您可以使用ISNULL

+0

謝謝:)但沒有改變,我已經試過了:) – user745110 2012-02-17 10:08:50

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的元素,從你的代碼合併就不叫。所以沒有行的總和將是空的。

+0

謝謝:)但同樣的事情,沒有改變 – user745110 2012-02-17 10:19:31