Mam problem, gdy dane są zerowe i pojawia się ostrzeżenie, gdy wynik jest wyświetlany. Jak rozwiązać ten problem? Jak zmienić puste dane na 0, gdy nie ma danych w tabeli?
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 następująco: -
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)
sql
sql-server-2005
Amin SCO
źródło
źródło
Count(closed) ... WHERE ... closed IS NULL
nie ma sensu, ponieważCOUNT
liczy tylkoNOT NULL
wartościOdpowiedzi:
Używałbyś głównie
COUNT
do podsumowania przez UID. W związku z tymCOUNT([uid])
wyświetli ostrzeżenie:podczas używania z lewym złączeniem, gdy liczony obiekt nie istnieje.
Użycie
COUNT(*)
w tym przypadku również spowoduje wyświetlenie niepoprawnych wyników, ponieważ wtedy zliczasz całkowitą liczbę wyników (tj. Rodziców), które istnieją.Używanie
COUNT([uid])
IS jest prawidłowym sposobem liczenia, a ostrzeżenie to nic innego jak ostrzeżenie. Jeśli jednak jesteś zaniepokojony i chcesz uzyskać w tym przypadku prawdziwą liczbę uidów, możesz użyć:SUM(CASE WHEN [uid] IS NULL THEN 0 ELSE 1 END) AS [new_count]
Nie spowodowałoby to dużego obciążenia zapytania. (przetestowano mssql 2008)
źródło
count([uid])
tego zadziałacount(1)
?Jednym ze sposobów rozwiązania tego problemu jest wyłączenie ostrzeżeń.
SET ANSI_WARNINGS OFF; GO
źródło
SELECT SUM(X) FROM (VALUES ( 1 + NULL)) V(X);SELECT 'This is executed fine';
Zastosowanie
ISNULL(field, 0)
Może być również używany z agregatami:Możesz jednak rozważyć zmianę
count(field) to count(*)
Edytować:
próbować:
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),
źródło
ISNULL(count(field), 0)
nie działa dla mnie w MSSQL 2008 R2. Problem polegał na tym, że próbowałem policzyć pole w lewej zewnętrznej tabeli połączonej, aby uzyskać liczbę rekordów w tabeli połączonej związanej z tabelą główną. Skończyło się na tym, że musiałem wykonać zapytanie podrzędne, które połączyło się wewnętrznie z dwiema tabelami, aby uzyskać liczbę według identyfikatora w głównej tabeli. Zapytanie podrzędne pozostawiono zewnętrznie połączone z główną tabelą na identyfikatorze. Liczba zapytania podrzędnego została następnie opakowana w ISNULL, aby uzyskać 0, które chciałem (bez komunikatu ostrzegawczego).Chcesz umieścić
ISNULL
wnętrzeCOUNT
funkcji, a nie na zewnątrz:Niedobrze:
ISNULL(COUNT(field), 0)
DOBRY:
COUNT(ISNULL(field, 0))
źródło
count(ISNULL(field, 0))
będzie równoważnecount(*)
, ponieważ liczona wartość nie może już byćNULL
.COUNT(ISNULL(field, 0))
różniący się odCOUNT(*)
, zrób to, SQL Fiddle 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ą one równe zero iISNULL(field, 0)
jest zawsze wartością różną od null,COUNT(ISNULL(field, 0))
zlicza wiersze. Po toCOUNT(*)
jest, a nie po to, aby OP.group by
zapytaniu w innym kontekście niż to, czego szukał PO. W moim przypadkuISNULL(COUNT(field), 0)
zwróciłoby liczbę 0 dla wszystkich wartości NULL, co było niepoprawne, ponieważ istniało wiele wartości null, podczas gdyCOUNT(ISNULL(field),0)
zwróciłoby poprawną liczbę dla łącznej liczby wartości NULL. Ale znowu dwa zupełnie różne scenariusze.Otrzymywałem ten błąd; Po prostu umieściłem
WHERE
klauzulę dla pola, które zostało użyte wcount
klauzuli. rozwiązał problem. Uwaga: jeśli istnieje wartość null, sprawdź, czy jest ona krytyczna dla raportu, ponieważ została wykluczona z liczby.Stare zapytanie:
select city, Count(Emp_ID) as Emp_Count from Emp_DB group by city
Nowe zapytanie:
select city, Count(Emp_ID) as Emp_Count from Emp_DB where Emp_ID is not null group by city
źródło
Jeśli jakakolwiek wartość Null istnieje wewnątrz funkcji agregującej, napotkasz ten problem. Zamiast poniższego kodu
SELECT Count(closed) FROM ticket WHERE assigned_to = c.user_id AND closed IS NULL
użyj jak
SELECT Count(ISNULL(closed, 0)) FROM ticket WHERE assigned_to = c.user_id AND closed IS NULL
źródło