2012-07-08 10 views
68

Mam problem, gdy dane są puste i pojawia się ostrzeżenie, gdy wyświetlany jest wynik. Jak rozwiązać ten problem ?. Jak zmienić dane zerowe na 0, gdy brak danych w tabeli ?.Ostrzeżenie: Wartość pusta jest eliminowana przez agregację lub inną operację SET w Aqua Data Studio

To jest mój kod: -

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 

Wynik wyglądać w ten sposób: -

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 (zamknięte) ... gdzie ... zamkniętym NULL' nie ma żadnego sensu, jak' 'tylko COUNT' liczy NIE NULL' values ​​ –

+1

Możliwy duplikat [Otrzymywanie ostrzeżenia: wartość pusta jest eliminowana przez agregację lub inną operację SET] (http://stackoverflow.com/questions/18719436/getting-warning-null-value-is-eliminated-by- an-aggregate-or-other-set-operation) – ArtB

+0

Otrzymuję to samo ostrzeżenie. Nie mam nic przeciwko ostrzeżeniu samo w sobie, ale potrzebuję, aby procedura przechowywana była uruchamiana przez agenta SQL, a kiedy to zrobię, to ostrzeżenie spowoduje niepowodzenie zadania agenta. – RichieACC

Odpowiedz

75

Będziesz głównie używać COUNT podsumować ponad UID. Dlatego

COUNT([uid]) przyniesie ostrzeżenie:

ostrzeżenie: wartość Null jest eliminowane przez agregatu lub innych operacji SET.

podczas używania z lewym złączeniem, gdy liczony obiekt nie istnieje.

W tym przypadku również wyrenderowałoby niepoprawne wyniki, ponieważ wtedy liczyłoby się całkowitą liczbę istniejących wyników (np. Rodziców).

Używanie IS jest prawidłowym sposobem liczenia, a ostrzeżenie to nic innego jak ostrzeżenie. Jednakże, jeśli jesteś zainteresowany i chcesz uzyskać prawdziwy rachubę UID w tym przypadku następnie można użyć:

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

To nie dodać wiele ogólnych do zapytania. (testowane mssql 2008)

+0

Tak wyszukiwane i próbowałem bez powodzenia, ale używając NULLIF spójność z ISNULL mnie zapisał, możesz spróbować kombinacja tych dwóch, na przykład: ISNULL (NULLIF ([fieldValue], 0), 1) – QMaster

+0

Czy rozwiązanie specjalnie dla kolumny "opencases" nie byłoby prostsze, jak tylko "select count (1) ..." (lub " liczyć "jakiejkolwiek innej literalnej)? Klauzula Where już określa "i closed is NULL", więc nie ma potrzeby sumowania instrukcji case w tym przypadku. Ponadto, słyszałem (eony temu), że "count (*)" nie jest tak skuteczne, jak zliczanie pojedynczej kolumny lub literału, ale nie jest pewne, czy tak jest nadal. – RowanPD

16

Zastosowanie ISNULL(field, 0) Może być również stosowany z kruszyw:

ISNULL(count(field), 0) 

jednak możesz rozważyć zmianę

Edit:

try:

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

Próbowałem, ale (null) nadal istnieje w wierszu. Jak zmienić tę wartość na 0, gdy dane są zerowe? –

+0

dziękuję, ale wartość null ma również ten sam problem, gdy pojawi się pusty. jak zmienić wartość na 0 ?. –

+0

Przypuszczam, że możesz zrobić to samo ... –

19

Jednym ze sposobów rozwiązania tego problemu jest wyłączenie ostrzeżeń.

SET ANSI_WARNINGS OFF; 
GO 
+18

Od [msdn] (https://msdn.microsoft.com/en-us/library/ms190368.aspx) nie tylko zmienia ostrzeżenia o wartości null w agregatach, ale także modyfikuje obsługę dzielenia przez zero i błędy przepełnienia . To powoduje, że to rozwiązanie jest dla mnie "nie do przyjęcia". –

+2

Dlaczego uważacie to za problem? [to tylko informacja] (http://stackoverflow.com/a/18719852/73226) –

+0

Zatrzymuje postęp od tego momentu. – Mukus

7

Chcesz umieścić ISNULL wewnątrz funkcji COUNT, nie na zewnątrz:

nie dobre: ​​ISNULL(COUNT(field), 0)

GOOD: COUNT(ISNULL(field, 0))

+9

To jest złe. 'count (ISNULL (field, 0))' będzie równoznaczne z 'count (*)', ponieważ wartość, która jest liczona, nie może już nigdy wynosić 'NULL'. – hvd

+0

@ hvd to nie jest źle, wartość wynosi tylko 0, gdy pole ma wartość null. –

+3

@GovindRai Nie, to naprawdę jest złe.Jeśli uważasz, że możesz wymyślić kontrprzykład, przykład gdzie 'COUNT (ISNULL (field, 0))' różni się od 'COUNT (*)', zrób to, [SQL Fiddle] (http: // www. sqlfiddle.com/) ułatwia udostępnienie takiego kontrprzykładu. Ale nie będziesz w stanie. Ponieważ 'COUNT' zlicza wartości inne niż null, nawet jeśli są zerowe, a' ISNULL (pole, 0) 'ma zawsze wartość inną niż null,' COUNT (ISNULL (pole, 0)) 'zlicza wiersze. To jest właśnie "COUNT (*)", a nie to, co było po OP. – hvd

-2

Jeśli jakakolwiek wartość Null istnieje wewnątrz funkcji zagregowanego ty zmierzy się z tym problemem. Zamiast poniżej kod

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

wykorzystanie takich jak

SELECT Count(ISNULL(closed, 0)) 
    FROM ticket 
    WHERE assigned_to = c.user_id 
    AND closed IS NULL 
Powiązane problemy