2011-01-29 22 views
1

私はVB6でフロントエンドを作成しています。データベースはSybaseです。 DSNを使用する私はいくつかの小さなexeを作成して、レポートをグリッドに配置します。それは正常に動作していた。SQL比較でNULLを比較する

しかし、私は以下のクエリを使用する場合、私は時間と回答済みのデータしか得ていません。 SQLクエリでクエリを実行すると、データが完成します。

私はあなたがwhen user_id <> Nullを使用することはできません(場合VB6では動作しません場合は、代替のために私を導いてください。

"select datepart (hh, callstartdt) as Hour, " _ 
    & " count(seqnum) as Anaswered," _ 
    & " sum(case when user_id <> NULL then 1 else 0 end) as answered_calls ," _ 
    & " sum(case when user_id <> NULL and datediff (ss, callstartdt, QueueEndDt) <= 20 then 1 else 0 end) , " _ 
    & " sum(case when user_id = NULL then 1 else 0 end), " _ 
    & " sum(case when user_id <> NULL and datediff (ss, callstartdt, QueueEndDt) <= 20 then 1 else 0 end)/count(seqnum), " _ 
    & " sum(Case when user_id <> NULL then 1 else 0 end)/count(seqnum) from acdcalldetail " _ 
    & " where callstartdt between '" & fromDt & "' and '" & toDt & "' " _ 
    & " and service_id not in (37,39,47,51,57,58,96,215,374,375) " _ 
    & " group by datepart (hh, callstartdt) " _ 
    & " order by datepart (hh, callstartdt)" 

答えて

5

合計を信じています。あなたがuser_id Is Nullまたはuser_id Is Not Nullを使用しなければなりません。何か=または<> NULLに

+0

をNULLは常に不明です "。いつもそれを見ることは役に立ちます。 –

+0

優秀な答え - これは常に新人を混乱させます –

+0

トーマス...ありがとうございました... – DhilK

0

一般的なルール:NULLを含む操作はすべてNULLを返します。テストが正( '==')であるか否かにかかわらずNULLを含むすべての比較に失敗します。 ( '<>')。唯一の例外は明白ですIS NOT [NULL]またはCOALESCE()/ ISNULL()の使用による無効をテストします。

1

sysbaseの場合は、sql-serverと同じです。

(古い?)のSybaseデフォルト

set ansi_nulls off 

select case when null = null then 1 else 0 end 
-- returns 1 

とANSI動作を切り替える設定があります。

set ansi_nulls on 

select case when null = null then 1 else 0 end 
-- returns 0 

今日、どの設定がよりエレガントですが、どの設定がより問題を引き起こすのかという質問はほとんどありません。

+0

これは解決された問題です。ありがとうございました。私は別の質問を開いて、それについて私を助けてください.... – DhilK

0

ニコラスは、私は常にfalseである必要があり、ヌルに対するその比較であなたに同意、しかし私は、ASE 15.0.3サーバ上で次のコードを試してみましたが、それはのための1を返す驚くべき結果

declare @xx int 
select @xx = null 
select @xx 
select 1 where null = @xx 

を得ました私が期待していなかったセカンドセレクト..

0

AnsweredはAspect UIPインバウンドコールの正しい定義ではないので、カウント(seqnum)を知っているだけです。 SwitchDispIdというラベルの付いたフィールドをチェックすると、そのフィールドに1または2があり、これは放棄コールと同じです。したがって、応答された呼び出しではありません。私はuser_idを使用して、nullではない応答の呼び出しを参照してくださいが、私はあなたにそれを認識させたいと思った。

また、あなたがより多くのビジネスを次のように見慣れているもののように見えるの名前を取得するためにサービステーブルにacdcalldetailテーブルに参加することができます。私は「言う私のコンピュータにこだわった付箋紙を持って

SELECT 
    Service_c 
    ,SUM(CASE WHEN acd.SwitchDispID IN (1,2) THEN 1 ELSE 0 END as Abandons 
    ,SUM(CASE WHEN acd.user_id is not null THEN 1 ELSE 0 END as Answered 
FROM acdcalldetail acd 
JOIN service s 
    ON s.service_id = acd.service_id 
    AND s.sourceid = acd.sourceid 
WHERE acd.CallStartDt between '20170501' AND '20170530' 
AND s.Service_id NOT IN (37,39,47,51,57,58,96,215,374,375) 
GROUP BY 
    s.Service_c 

"select datepart (hh, callstartdt) as Hour, " _ 
    & " count(seqnum) as Anaswered," _ 
    & " sum(case when user_id <> NULL then 1 else 0 end) as answered_calls ," _ 
    & " sum(case when user_id <> NULL and datediff (ss, callstartdt, QueueEndDt) <= 20 then 1 else 0 end) , " _ 
    & " sum(case when user_id = NULL then 1 else 0 end), " _ 
    & " sum(case when user_id <> NULL and datediff (ss, callstartdt, QueueEndDt) <= 20 then 1 else 0 end)/count(seqnum), " _ 
    & " sum(Case when user_id <> NULL then 1 else 0 end)/count(seqnum) from acdcalldetail " _ 
    & " where callstartdt between '" & fromDt & "' and '" & toDt & "' " _ 
    & " and service_id not in (37,39,47,51,57,58,96,215,374,375) " _ 
    & " group by datepart (hh, callstartdt) " _ 
    & " order by datepart (hh, callstartdt)"