Uyarı: Boş değer, Aqua Data Studio'da bir toplama veya başka bir SET işlemiyle ortadan kaldırılır


99

Veriler boş olduğunda bir sorun yaşıyorum ve sonuç görüntülendiğinde uyarı görüntüleniyor. Bu problem nasıl çözülür? Tabloda veri yokken boş verileri 0 olarak nasıl değiştirebilirim?

Bu benim kodum: -

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 

Sonuç şöyle görünür: -

 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 NULLCOUNTsadece NOT NULLdeğerleri saydığı için herhangi bir anlam ifade etmiyor
Martin Smith

1
Olası uyarı alma
Kızak

Ben de aynı uyarıyı alıyorum. Uyarıyı kendi başına umursamıyorum, ancak saklı yordamın SQL Aracısı tarafından çalıştırılmasına ihtiyacım var ve bunu yaptığımda, uyarı Agent işinin başarısız olmasına neden oluyor.
RichieACC

Bu soru mantıklı değil.
xr280xr

Yanıtlar:


106

Çoğunlukla COUNTbir UID üzerinden özetlemek için kullanırsınız . Bu nedenle

COUNT([uid]) uyarıyı üretecek:

Uyarı: Boş değer, bir toplama veya başka bir SET işlemi ile elimine edilir.

sol birleşim ile kullanılırken, sayılan nesnenin mevcut olmadığı durumlarda

COUNT(*)Bu durumda kullanmak , mevcut toplam sonuç sayısını (yani ebeveynleri) sayacağınız için yanlış sonuçlara da neden olur.

COUNT([uid])IS'yi kullanmak geçerli bir sayma yöntemidir ve uyarı bir uyarıdan başka bir şey değildir. Bununla birlikte, endişeliyseniz ve bu durumda gerçek bir kullanıcı sayısı elde etmek istiyorsanız, şunu kullanabilirsiniz:

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

Bu, sorgunuza çok fazla genel gider eklemeyecektir. (mssql 2008'de test edildi)


1
Çok aradım ve başarılı olamadım ama NULLIF'i ISNULL ile birlikte kullanmak beni kurtardı, Bu ikisinin kombinasyonunu deneyebilirsiniz, örneğin: ISNULL (NULLIF ([fieldValue], 0), 1)
QMaster

Özellikle "açılışlar" sütunu için olan çözüm, "sayım (1) ..." (veya başka bir değişmezin "sayımı") kadar daha basit olmaz mıydı? Where cümlesi zaten "ve closed NULL" olduğunu belirtir, bu nedenle bu örnekte bir case ifadesini toplamaya gerek yoktur. Ayrıca, "sayım (*)" ın tek bir sütunu saymak kadar verimli olmadığını, ancak durumun hala böyle olup olmadığından emin olmadığımı duydum (yıllar önce).
RowanPD

Bunun yerine count([uid])kullanmak işe yarar count(1)mı?
Farhan

Siz efendim @Mat Traherne beni kurtardı :) Bunu bir Excel dosyasındaki verileri bağlamaya çalışırken aldım, zaten bir ISNULL (x, y) vardı, ancak bu işe yaramadı, ancak "TOPLA (X NULL OLDUĞUNDA DURUMDA 0 BAŞKA X END) AS Z "harika çalıştı! Teşekkürler!
Dimitri

22

Bu sorunu çözmenin bir yolu uyarıları kapatmaktır.

SET ANSI_WARNINGS OFF;
GO

32
Gönderen msdn , bu sadece agrega içinde boş ilgili uyarıları değişmez, aynı zamanda sıfır ve taşma hataları böl taşıma değiştirmek. Bu, bu çözümün benim için "hayır" olmasına neden oluyor.
Frédéric

3
Bunu neden bir sorun olarak görüyorsunuz? sadece bilgilendirme
Martin Smith

2
@Mukus - Hayır değil. Önem seviyesi 10'da bir mesaj yazdırır. 10 veya daha düşük herhangi bir şey, bilgi amaçlıdır ve hata olarak kabul edilmez. SELECT SUM(X) FROM (VALUES ( 1 + NULL)) V(X);SELECT 'This is executed fine';
Martin Smith

5
@RichieACC Evet, çünkü bu bir cevap değil ve son derece arzu edilen ANSI uyarılarını bir bilgilendirme mesajından kaçınmanın tembel bir yolu olarak devre dışı bırakmak, diğer birçok, açıkça bilgi içermeyen şeylerde kırılmaya neden olacaktır.
underscore_d

3
Arabanızın uyarı ışıklarının yanmasının çözümü sadece ön göğüsün fişini çekmektir. Bu muhtemelen stackoverflow'da gördüğüm en kötü cevap.
VoronoiPotato

18

Kullanım ISNULL(field, 0)Aynı zamanda kümelerle de kullanılabilir:

ISNULL(count(field), 0)

Ancak, değiştirmeyi düşünebilirsiniz count(field) to count(*)

Düzenle:

Deneyin:

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

Denedim ama (null) hala satırda var. Veriler null olduğunda bu değer nasıl 0 olarak değiştirilir?
Amin SCO

teşekkür ederim, ancak boş olmayan değer de null göründüğünde aynı sorunu yaşadı. değeri 0 olarak nasıl değiştirebilirim?
Amin SCO

1
Bilginize: ISNULL(count(field), 0)MSSQL 2008 R2'de benim için çalışmadı. Sorun, ana tabloyla ilişkili birleştirilmiş tablodaki kayıtların sayısını elde etmek için sol dıştaki birleştirilmiş tablodaki bir alanı saymaya çalışmamdı. Ana tablodaki kimlik başına sayıyı almak için iki tabloyu birleştiren bir alt sorgu yapmak zorunda kaldım. Alt sorgu, kimlikteki ana tabloya dışta birleştirildi. Alt sorgunun sayısı daha sonra istediğim 0'ı elde etmek için bir ISNULL'a sarıldı (uyarı mesajı olmadan).
Trisped

1
Chris, COUNT (ISNULL (Alan, 0)) tam tersi olmamalı. Geçerli biçim sorgulandığında, döndürülecek olan tek şey 0'dır ve gerçek bir sayı değildir. Mantık: Count (alan), boş olan tüm alan değerleri için tek bir NULL döndürür ve ISNULL bunu 0 olarak ayarlar ve 0 döndürür.
Govind Rai

10

İşlevin dışına değil ISNULLiçini koymak istiyorsunuz COUNT:

İyi değil: ISNULL(COUNT(field), 0)

İYİ: COUNT(ISNULL(field, 0))


12
Bu yanlış. sayılmakta olan değer artık hiçbir zaman olamayacağı count(ISNULL(field, 0))için eşdeğer count(*)olacaktır NULL.

@hvd bu yanlış değil, alan boş olduğunda değer yalnızca 0'dır.
Govind Rai

3
@GovindRai Hayır, gerçekten yanlış. Bir karşı örnek bulabileceğinize inanıyorsanız, COUNT(ISNULL(field, 0))bunun farklı olduğu bir örnek COUNT(*), lütfen yapın, SQL Fiddle böyle bir karşı örneği paylaşmayı kolaylaştırır. Ama yapamayacaksın. Yana COUNTsayımlar boş olmayan değerleri, sıfır ve hatta eğer ISNULL(field, 0)hep boş olmayan değeridir COUNT(ISNULL(field, 0))sayımları satırlar. Buradaki COUNT(*)OP'nin peşinde olduğu şey bu değil.

2
@hvd Haklısın. Cevabım, group byOP'nin peşinde olduğundan farklı bir bağlamdaki bir sorguya dayanıyordu . Benim durumumda, ISNULL(COUNT(field), 0)birden fazla boş değer olduğundan yanlış olan tüm NULL değerler için 0 sayısını döndürürken COUNT(ISNULL(field),0), toplam NULL değer sayısı için doğru sayıyı döndürür. Ama yine, tamamen farklı iki senaryo.
Govind Rai

Çalışmasını sağladım. Hadi bakalım! sqlfiddle.com/#!3/ee0546/2 Yorumunuza olumlu oy verdi lol
Govind Rai

-2

Bu hatayı alıyordum; Sadece WHEREiçinde kullanılan alan için bir cümle koydumcount . sorunu çözdü. Not: boş değer mevcutsa, sayıya dahil edilmediğinden rapor için kritik olup olmadığını kontrol edin.

Eski sorgu:

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

Yeni sorgu:

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

-3

Aggregate işlevinde herhangi bir Null değer varsa, bu sorunla karşılaşırsınız. Aşağıdaki kod yerine

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

gibi kullan

SELECT Count(ISNULL(closed, 0))
  FROM   ticket
  WHERE  assigned_to = c.user_id
  AND closed IS NULL
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.