警告:Null値は、Aqua Data Studioの集計またはその他のSET操作によって削除されます


94

データがnullのときに問題が発生し、結果が表示されるときに警告が表示されました。この問題を解決するには?テーブルにデータがないときにnullデータを0に変更する方法

これは私のコードです:-

SELECT DISTINCT c.username             AS assigner_officer,
                d.description          AS ticketcategory,
                (SELECT Count(closed)
                 FROM   ticket
                 WHERE  assigned_to = c.user_id
                        AND closed IS NOT NULL
                 GROUP  BY assigned_to)closedcases,
                (SELECT Count(closed)
                 FROM   ticket
                 WHERE  assigned_to = c.user_id
                        AND closed IS NULL
                 GROUP  BY assigned_to)opencases
FROM   ticket a
       JOIN ticketlog b
         ON a.ticketid = b.ticketid
       JOIN access c
         ON a.assigned_to = c.user_id
       JOIN ticket_category d
         ON a.cat_code = d.id
       JOIN lookup_department e
         ON a.department_code = e.code 

結果は次のようになります:-

 Warnings: ---> 
   W (1): Warning: Null value is eliminated by an aggregate or other SET operation.
          <--- 
 assigner_officer     ticketcategory     closedcases     opencases    
 -------------------  -----------------  --------------  ------------ 
 abdulhafiz           Enquiry            (null)          0            
 affan                Enquiry            12              (null)       
 amirul               Enquiry            1               (null)       
 azrul_fahmi          Enquiry            45              0            
 Azwani               Enquiry            (null)          0            
 chai                 Enquiry            4               (null)       
 dalinawati           Enquiry            1               0            
 Emmy                 Complaints         (null)          0            
 Fadhlia              Enquiry            38              0            
 fairulhalif          Others             1               (null)       
 farikh               Enquiry            (null)          0            
 ismailh              Enquiry            28              0            
 izzahanna            Enquiry            (null)          0            
 Kamsuzilawati        Enquiry            1               (null)     

1
Count(closed) ... WHERE ... closed IS NULL値をCOUNT数えるだけなので意味がありませんNOT NULL
マーティン・スミス


同じ警告が表示されます。警告自体は気にしませんが、SQLエージェントによって実行されるストアドプロシージャが必要です。その場合、警告によってエージェントジョブが失敗します。
RichieACC 2015年

この質問は意味がありません。
xr280xr 2017年

回答:


100

ほとんどの場合COUNT、UIDの要約に使用します。したがって

COUNT([uid]) 警告が表示されます:

警告:Null値は、集計またはその他のSET操作によって削除されます。

カウントされたオブジェクトが存在しない左結合で使用されている間。

COUNT(*)この場合に使用すると、存在する結果(つまり、親)の総数を数えるため、誤った結果が表示されます。

COUNT([uid])ISの使用は有効なカウント方法であり、警告は単なる警告にすぎません。ただし、問題があり、この場合にuidの真の数を取得したい場合は、以下を使用できます。

SUM(CASE WHEN [uid] IS NULL THEN 0 ELSE 1 END) AS [new_count]

これはクエリに多くのオーバーヘッドを追加しません。(テスト済みmssql 2008)


1
私はそのように検索して試したが成功しなかったが、ISNULLと共にNULLIFを使用することで節約できた。たとえば、次の2つの組み合わせを試すことができる:ISNULL(NULLIF([fieldValue]、0)、1)
QMaster

「opencases」列専用のソリューションは、「select count(1)...」(または他のリテラルの「count」)のように単純ではないでしょうか?Where句はすでに「and closed is NULL」を指定しているため、このインスタンスでcaseステートメントを合計する必要はありません。また、(数日前に) "count(*)"は単一の列またはリテラルを数えるほど効率的ではないと聞きましたが、それがまだ当てはまるかどうかはわかりません。
RowanPD 2018

の代わりにcount([uid])、それを使用することはできcount(1)ますか?
ファルハン

@Mat Traherneが私を救ってくれました:)私はこれをExcelファイルのデータに接続しようとしましたが、すでにISNULL(x、y)がありましたが、機能しませんでしたが、「SUM(CASE WHEN X IS NULL THEN 0 ELSE X END)AS Z "はうまくいきました!ありがとう!
ディミトリ

19

この問題を解決する1つの方法は、警告をオフにすることです。

SET ANSI_WARNINGS OFF;
GO

29
msdnから、これは集合体のnullに関する警告を変更するだけでなく、ゼロ除算およびオーバーフローエラーの処理も変更します。これにより、このソリューションは私にとって「ノーゴー」になります。
フレデリック

3
なぜとにかくそれを問題と見なすのですか?それは単なる情報提供です
マーティン・スミス

2
@Mukus-いいえ、ありません。重大度レベル10のメッセージを出力します。10以下のものは、情報エラーであるとは見なされません。SELECT SUM(X) FROM (VALUES ( 1 + NULL)) V(X);SELECT 'This is executed fine';
マーティン・スミス

5
@RichieACCええ、これは答えではないため、1つの情報メッセージを回避する遅延方法として非常に望ましいANSI警告を無効にすると、他の多くの、明らかに非情報的なもので破損が発生します。
underscore_d

3
車の警告灯が点灯している場合の解決策は、ダッシュボードのプラグを抜くことです。これはおそらく、stackoverflowで今まで見た中で最悪の答えです。
VoronoiPotato

17

使用するISNULL(field, 0)こともできます集計:

ISNULL(count(field), 0)

ただし、変更を検討するかもしれません count(field) to count(*)

編集:

試してください:

closedcases = ISNULL(
   (select count(closed) from ticket       
    where assigned_to = c.user_id and closed is not null       
    group by assigned_to), 0), 

opencases = ISNULL(
    (select count(closed) from ticket 
     where assigned_to = c.user_id and closed is null 
     group by assigned_to), 0),

試しましたが、(null)はまだ並んでいます。データがnullのときにこの値を0に変更するにはどうすればよいですか?
アミンSCO

ありがとうございますが、nullが表示された場合、null以外の値でも同じ問題が発生しました。値を0に変更する方法。
アミンSCO

1
参考:ISNULL(count(field), 0)MSSQL 2008 R2では動作しませんでした。この問題は、メインテーブルに関連する結合テーブルのレコード数を取得するために、左外部結合テーブルのフィールドをカウントしようとしたためです。メインテーブルのIDごとのカウントを取得するには、2つのテーブルを内部結合するサブクエリを作成する必要がありました。サブクエリは、IDのメインテーブルに外部結合されたままでした。次に、サブクエリのカウントがISNULLにラップされ、(警告メッセージなしで)必要な0が取得されました。
2012年

1
Chris、それはCOUNT(ISNULL(Field、0))でなければなりません。現在の形式を照会すると、返されるのは0であり、実際の数ではありません。ロジック:カウント(フィールド)ヌルであり、ISNULLは0を返す、0にそれを設定するすべてのフィールド値について単一のNULLを返します
Govindライ

9

あなたISNULLCOUNT関数の内側ではなく外側に置きたいです:

良くない: ISNULL(COUNT(field), 0)

良い: COUNT(ISNULL(field, 0))


12
これは間違っています。カウントされている値はになり得ないcount(ISNULL(field, 0))ためcount(*)、はと同等になりますNULL

@hvd間違いではありません。フィールドがnullの場合、値は0のみです。
Govind Rai

3
@GovindRaiいいえ、本当に間違っています。あなたは反例を考え出すことができると信じている場合、例はどこCOUNT(ISNULL(field, 0))異なっているCOUNT(*)、そうしてください、SQLフィドルは、このような反例を共有しやすいことになります。しかし、それはできません。以来COUNT数null以外の値は、彼らがゼロであり、場合でも、ISNULL(field, 0)常にnull以外の値であり、COUNT(ISNULL(field, 0))数行。それCOUNT(*)が目的であり、ここのOPの目的ではありません。

2
@hvd正解です。私の答えはgroup by、OPの目的とは異なるコンテキストでのクエリに基づいていました。私の場合、ISNULL(COUNT(field), 0)複数のnull値があったために正しくなかったすべてのNULL値に対して0のカウントを返し、NULL値COUNT(ISNULL(field),0)の総数に対して正しい数を返します。しかし、繰り返しになりますが、2つのまったく異なるシナリオ。
Govind Rai

うまくいきました。どうぞ!sqlfiddle.com/#!3/ee0546/2コメントに賛成しましたlol
Govind Rai

-2

このエラーが発生しました。WHERE節内で使用されたフィールドに節を置くだけcountです。それは問題を解決しました。注:null値が存在する場合は、その値がカウントから除外されているため、レポートにとって重要かどうかを確認してください。

古いクエリ:

select city, Count(Emp_ID) as Emp_Count 
from Emp_DB
group by city

新しいクエリ:

select city, Count(Emp_ID) as Emp_Count 
from Emp_DB
where Emp_ID is not null
group by city

-3

集計関数内にNull値が存在する場合、この問題が発生します。以下のコードの代わりに

 SELECT Count(closed)
  FROM   ticket
  WHERE  assigned_to = c.user_id
  AND closed IS NULL

のように使う

SELECT Count(ISNULL(closed, 0))
  FROM   ticket
  WHERE  assigned_to = c.user_id
  AND closed IS NULL
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.