Cảnh báo: Giá trị rỗng bị loại bỏ bởi hoạt động tổng hợp hoặc SET khác trong Aqua Data Studio


95

Tôi gặp sự cố khi dữ liệu rỗng và cảnh báo đã xuất hiện khi hiển thị kết quả. Làm thế nào để giải quyết vấn đề này?. Làm thế nào để thay đổi dữ liệu null thành 0 khi không có dữ liệu trong bảng ?.

Đây là mã của tôi: -

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 

Kết quả xuất hiện như sau: -

 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 NULLkhông thực hiện bất kỳ cảm giác như COUNTchỉ đếm NOT NULLgiá trị
Martin Smith


Tôi nhận được cảnh báo tương tự. Tôi không bận tâm đến cảnh báo trong và của chính nó, nhưng, tôi cần thủ tục được lưu trữ để chạy bởi SQL Agent và khi tôi làm điều đó, cảnh báo sẽ khiến công việc Agent không thành công.
RichieACC

Câu hỏi này không có ý nghĩa.
xr280xr

Câu trả lời:


101

Bạn chủ yếu sẽ sử dụng COUNTđể tóm tắt qua một UID. vì thế

COUNT([uid]) sẽ tạo ra cảnh báo:

Cảnh báo: Giá trị rỗng bị loại bỏ bởi hoạt động tổng hợp hoặc SET khác.

trong khi được sử dụng với phép nối bên trái, trong đó đối tượng được đếm không tồn tại.

Sử dụng COUNT(*)trong trường hợp này cũng sẽ hiển thị kết quả không chính xác, vì sau đó bạn sẽ đếm tổng số kết quả (tức là cha mẹ) tồn tại.

Sử dụng COUNT([uid])IS là một cách đếm hợp lệ và cảnh báo không gì khác hơn là một lời cảnh báo. Tuy nhiên, nếu bạn lo lắng và bạn muốn có được số lượng uids thực sự trong trường hợp này thì bạn có thể sử dụng:

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

Điều này sẽ không thêm nhiều chi phí vào truy vấn của bạn. (thử nghiệm mssql 2008)


1
Tôi nên đã tìm kiếm và cố gắng không thành công nhưng sử dụng kết hợp với NULLIF ISNULL đã cứu tôi, Bạn có thể thử kết hợp của hai ví dụ: ISNULL (NULLIF ([fieldValue], 0), 1)
QMaster

Giải pháp cụ thể cho cột "tủ mở" sẽ không đơn giản hơn chỉ là "chọn số (1) ..." (hoặc "số" của bất kỳ chữ nào khác)? Mệnh đề Where đã chỉ định "và đóng là NULL" nên không cần tổng kết một câu lệnh trường hợp trong trường hợp này. Ngoài ra, tôi đã nghe (aeons trước) rằng "count (*)" không hiệu quả bằng đếm một cột hoặc theo nghĩa đen nhưng không chắc liệu điều đó có còn xảy ra hay không.
RowanPD

Thay vì count([uid]), nó sẽ hoạt động để sử dụng count(1)?
Farhan

Bạn ạ @Mat Traherne đã cứu tôi :) Tôi nhận được điều này đang cố gắng kết nối dữ liệu trong tệp Excel, đã có ISNULL (x, y) nhưng điều đó không hoạt động, tuy nhiên "SUM (CASE WHEN X IS NULL THEN 0 ELSE X HẾT) AS Z "hoạt động tuyệt vời! Cảm ơn!
Dimitri

20

Một cách để giải quyết vấn đề này là tắt các cảnh báo.

SET ANSI_WARNINGS OFF;
GO

30
Từ msdn , điều này không chỉ thay đổi cảnh báo về null trong tổng thể mà còn sửa đổi việc xử lý lỗi chia cho 0 và lỗi tràn. Điều này khiến giải pháp này là một "không đi" đối với tôi.
Frédéric

3
Tại sao bạn lại coi nó như một vấn đề? nó chỉ là thông tin
Martin Smith

2
@Mukus - Không, không. Nó in ra một thông báo ở cấp độ Mức độ nghiêm trọng 10. Bất cứ điều gì 10 hoặc thấp hơn là thông tin không được coi là lỗi. SELECT SUM(X) FROM (VALUES ( 1 + NULL)) V(X);SELECT 'This is executed fine';
Martin Smith

5
@RichieACC Vâng, bởi vì đây không phải là câu trả lời và việc vô hiệu hóa các cảnh báo ANSI cực kỳ mong muốn như một cách lười biếng để tránh một tin nhắn thông tin sẽ gây ra sự cố trong nhiều thứ khác, rõ ràng là không có thông tin.
underscore_d

3
Giải pháp cho việc đèn cảnh báo trên ô tô của bạn đang sáng là chỉ cần rút phích cắm của bảng điều khiển. Đây có lẽ là câu trả lời tồi tệ nhất mà tôi từng thấy trên stackoverflow.
VoronoiPotato 29/03/18

17

Sử dụng ISNULL(field, 0)Nó cũng có thể được sử dụng với các tập hợp:

ISNULL(count(field), 0)

Tuy nhiên, bạn có thể cân nhắc thay đổi count(field) to count(*)

Biên tập:

thử:

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

tôi đã thử nhưng (null) vẫn tồn tại trong hàng. Làm thế nào để thay đổi giá trị này thành 0 khi dữ liệu là null?
Amin SCO

cảm ơn bạn nhưng giá trị không null cũng gặp vấn đề tương tự khi giá trị null xuất hiện. làm thế nào để thay đổi giá trị thành 0 ?.
Amin SCO

1
FYI: ISNULL(count(field), 0)không hoạt động đối với tôi trong MSSQL 2008 R2. Sự cố là do tôi đang cố gắng đếm một trường trong bảng được nối bên ngoài bên trái để lấy số lượng bản ghi trong bảng đã nối liên quan đến bảng chính. Cuối cùng tôi phải thực hiện một truy vấn phụ mà bên trong kết hợp hai bảng để có được số lượng mỗi ID trong bảng chính. Truy vấn phụ được kết hợp bên ngoài với bảng chính trên ID. Số lượng truy vấn phụ sau đó được bao bọc trong ISNULL để nhận được 0 mà tôi muốn (không có thông báo cảnh báo).
Đã phát hành

1
Chris, nó phải là COUNT (ISNULL (Field, 0)) chứ không phải ngược lại. Truy vấn định dạng hiện tại, tất cả những gì sẽ được trả về là 0 và không phải là số thực. Logic: Count (lĩnh vực) sẽ trả về một NULL duy nhất cho tất cả các giá trị trường có vô ISNULL sẽ thiết lập đó để 0, trả lại một 0.
Govind Rai

9

Bạn muốn đặt ISNULLbên trong của COUNThàm chứ không phải bên ngoài:

Không tốt: ISNULL(COUNT(field), 0)

TỐT: COUNT(ISNULL(field, 0))


12
Cái này sai. count(ISNULL(field, 0))sẽ tương đương với count(*), vì giá trị đang được đếm có thể không còn nữa NULL.

@hvd không sai, giá trị chỉ bằng 0 khi trường rỗng.
Govind Rai

3
@GovindRai Không, nó thực sự là sai. Nếu bạn tin rằng bạn có thể đưa ra một ví dụ đếm ngược, một ví dụ COUNT(ISNULL(field, 0))khác với COUNT(*), hãy làm như vậy, SQL Fiddle giúp bạn dễ dàng chia sẻ một ví dụ đếm ngược như vậy. Nhưng bạn sẽ không thể. Vì COUNTđếm các giá trị không rỗng ngay cả khi chúng bằng 0 và ISNULL(field, 0)luôn là giá trị không rỗng, nên COUNT(ISNULL(field, 0))đếm các hàng. Đó là những gì COUNT(*)dành cho chứ không phải những gì OP ở đây đã theo đuổi.

2
@hvd Bạn nói đúng. Câu trả lời của tôi dựa trên một group bytruy vấn trong bối cảnh khác với những gì OP sau đó. Trong trường hợp của tôi, ISNULL(COUNT(field), 0)sẽ trả về số lượng 0 cho tất cả các giá trị NULL không chính xác vì có nhiều giá trị rỗng trong khi COUNT(ISNULL(field),0)sẽ trả về số lượng chính xác cho tổng số # giá trị NULL. Nhưng một lần nữa, hai kịch bản hoàn toàn khác nhau.
Govind Rai

Có nó để làm việc. Của bạn đây! sqlfiddle.com/#!3/ee0546/2 Đã ủng hộ nhận xét của bạn lol
Govind Rai

-2

Tôi đã nhận được lỗi này; Tôi chỉ đặt một WHEREmệnh đề cho trường được sử dụng trong countmệnh đề. nó đã giải quyết được vấn đề. Lưu ý: nếu giá trị null tồn tại, hãy kiểm tra xem giá trị đó có quan trọng đối với báo cáo hay không, vì nó bị loại trừ trong số lượng.

Truy vấn cũ:

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

Truy vấn mới:

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

-3

Nếu bất kỳ giá trị Null nào tồn tại bên trong hàm tổng hợp, bạn sẽ phải đối mặt với vấn đề này. Thay vì mã bên dưới

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

sử dụng như

SELECT Count(ISNULL(closed, 0))
  FROM   ticket
  WHERE  assigned_to = c.user_id
  AND closed IS NULL
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.