2012-02-17 3 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

+0

@Schiaviniスクリーンショットがあり、それを見 – user745110

+0

を持っている。これは、編集し、[OK]のColdFusionからではなく、SQL Serverの管理スタジオ – Schiavini

答えて

3

あなたのお問い合わせには誤りがありません。各employee_idに基づいてORDERSから選択しようとしています。あなたはそれをループしています。

ある月に注文がない場合は、結果セット内にその行がありません。

最後の4か月間だけ注文があったとしても、現在出力している月が列ヘッダーと一致していることを確認していないため、最初の4個にプッシュされます。メタコードのビットのために

、私はこのルート

1を下に行くだろう - これはあなたが後で反復処理することができ、STCを与える

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

を次のように配列を作成します。

2 - 私は、各クエリに対するループは

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

3だろう - それは0をだ場合でも、私はその配列

<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> 

この方法を反復なり、毎月は常に値を持つことになります。なし注文を持つ行にレコードを持っていないこと、それだけを扱う配列に挿入だとあなたは今も必要ありません、彼らはので、あなたのクエリが

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なることが0にデフォルト設定を意味単純な事実として合体を捨てることができます注文する

+0

はサイモンありがとう、私はそれが既にUを行うので、何:)知っていたそれを試してみました@ – user745110

+0

より完全な解決策が更新されました。これは、とにかく使用する方法の1つです。テーブルデータは、ColdFusion配列から取得され、各テーブルセルのデフォルト値は0です。次に、問合せにデータベースレコードがあるものをすべて記入します。 –

+0

ありがとう、私はこの1つを試してみる:) – user745110

0

TRy ISNULL()COALESCEの代わりに。 COALESCEは複数の引数に使用されます。複数の引数が必要ない場合はISNULLを使用できます。

+0

感謝:)しかし変更なし、と私はすでに – user745110

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の要素がない場合は、あなたのコードからの合体は呼び出されません。そのため、行がない場合はnullになります。

+0

ありがとう:)しかし、同じこと、変更なし – user745110

関連する問題