2012-07-08 14 views
68

Tôi gặp sự cố khi dữ liệu rỗng và cảnh báo xuất hiện khi kết quả hiển thị. Cách 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 ?.Cảnh báo: Giá trị rỗng được loại bỏ bằng tổng hợp hoặc hoạt động SET khác trong Aqua Data Studio

Đâ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ư thế này: -

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)  
+0

'Count (đóng) ... WHERE ... đóng LÀ NULL' không thực hiện bất kỳ ý nghĩa là 'COUNT' chỉ đếm' NOT Giá trị NULL' –

+1

Có thể trùng lặp của [Nhận cảnh báo: Giá trị rỗng được loại bỏ bởi một phép toán tổng hợp hoặc hoạt động SET khác] (http://stackoverflow.com/questions/18719436/getting-warning-null-value-is-eliminated-by- a-aggregate-or-other-set-operation) – ArtB

+0

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

Trả lời

75

Bạn sẽ chủ yếu được sử dụng COUNT để tóm tắt qua một UID. Do đó

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

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

trong khi đang được sử dụng với phép nối trái, nơi đối tượng được tính 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ẽ tính tổng số kết quả (nghĩa là cha mẹ) tồn tại.

Sử dụng COUNT([uid]) LÀ cách tính hợp lệ và cảnh báo không có gì khác ngoài cảnh báo. Tuy nhiên, nếu bạn quan tâm và bạn muốn nhận đượ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. (đã kiểm tra mssql 2008)

+0

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

+0

Không phải giải pháp cụ thể cho cột "opencases" sẽ đơn giản hơn chỉ là "select count (1) ..." (hoặc " đếm "của bất kỳ chữ nào khác)? Mệnh đề Where đã chỉ định "và đóng là NULL" vì vậy không cần phải tổng hợp một câu lệnh case trong trường hợp này. Ngoài ra, tôi đã nghe (aeons trước đây) rằng "đếm (*)" không hiệu quả như đếm một cột hoặc chữ nhưng không chắc chắn nếu đó vẫn là trường hợp. – RowanPD

16

Sử dụng ISNULL(field, 0) Nó cũng có thể được sử dụng với uẩn:

ISNULL(count(field), 0) 

Tuy nhiên, bạn có thể xem xét việc thay đổi

Edit:

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), 
+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? –

+0

cảm ơn bạn nhưng giá trị không null cũng có cùng một vấn đề khi null xuất hiện. làm thế nào để thay đổi giá trị thành 0 ?. –

+0

Tôi cho rằng bạn chỉ có thể làm điều tương tự ... –

19

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

SET ANSI_WARNINGS OFF; 
GO 
+18

Từ [msdn] (https://msdn.microsoft.com/en-us/library/ms190368.aspx), điều này không chỉ thay đổi cảnh báo về null trong tổng hợp, mà còn sửa đổi việc xử lý chia cho số không và lỗi tràn . Điều này làm cho giải pháp này trở thành "không đi" đối với tôi. –

+2

Tại sao bạn coi đó là vấn đề? [nó chỉ là thông tin] (http://stackoverflow.com/a/18719852/73226) –

+0

Nó dừng tiến trình từ thời điểm đó. – Mukus

7

Bạn muốn đặt ISNULL bên trong COUNT chức năng, không phải bên ngoài:

Không TỐT: ISNULL(COUNT(field), 0)

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

+9

Điều này là sai. 'count (ISNULL (trường, 0))' sẽ tương đương với 'count (*)', vì giá trị đang được đếm không còn có thể là 'NULL' nữa. – hvd

+0

@hvd không sai, giá trị chỉ bằng 0 khi trường là null. –

+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ột ví dụ trong đó 'COUNT (ISNULL (trường, 0))' khác với 'COUNT (*)', hãy làm như vậy, [SQL Fiddle] (http: // www. sqlfiddle.com/) giúp dễ dàng chia sẻ một ví dụ như vậy. Nhưng bạn sẽ không thể. Vì 'COUNT' đếm các giá trị không null ngay cả khi chúng bằng 0, và' ISNULL (trường, 0) 'luôn là giá trị không null,' COUNT (ISNULL (trường, 0)) 'đếm các hàng. Đó là những gì 'COUNT (*)' là cho và không phải những gì OP ở đây là sau. – hvd

-2

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

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