Попередження: Нульове значення усувається за допомогою сукупної або іншої операції SET в Aqua Data Studio


95

У мене проблема, коли дані є нульовими, а попередження з’являється при відображенні результату. Як вирішити цю проблему ?. Як змінити нульові дані на 0, коли в таблиці немає даних ?.

Це мій код: -

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 

Результат виглядає так: -

 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 NULLне має сенсу, оскільки COUNTпідраховує лише NOT NULLзначення
Мартін Сміт


Я отримую те саме попередження. Я не заперечую перед самим собою попередженням, але мені потрібно, щоб збережена процедура запускалася агентом SQL, і коли я це роблю, попередження спричиняє збій завдання агента.
RichieACC

Це питання не має сенсу.
xr280xr

Відповіді:


101

Ви б в основному використовували COUNTдля підведення підсумків над UID. Тому

COUNT([uid]) видасть попередження:

Попередження: Нульове значення усувається за допомогою сукупності або іншої операції SET.

при використанні з лівим з'єднанням, де підрахований об'єкт не існує.

Використання COUNT(*)в цьому випадку також призведе до неправильних результатів, оскільки тоді ви будете підраховувати загальну кількість існуючих результатів (тобто батьків).

Використання COUNT([uid])IS є дійсним способом підрахунку, і попередження - це не що інше, як попередження. Однак, якщо вас це турбує, і ви хочете отримати справжній рахунок uids в цьому випадку, ви можете використовувати:

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

Це не додасть багато накладних витрат до вашого запиту. (перевірено mssql 2008)


1
Я так шукав і намагався безуспішно, але використання NULLIF в поєднанні з ISNULL мене врятувало. Ви можете спробувати комбінацію цих двох, наприклад: ISNULL (NULLIF ([fieldValue], 0), 1)
QMaster

Хіба рішення спеціально для стовпця "opencases" не буде простішим, як просто "select count (1) ..." (або "count" будь-якого іншого літералу)? У реченні Where вже вказано "і закрито NULL", тому в цьому випадку не потрібно підсумовувати випадок справи. Крім того, я чув (ще кілька років тому), що "count (*)" не настільки ефективний, як підрахунок окремого стовпця або літералу, але я не впевнений, що це все ще так.
RowanPD

Замість того count([uid]), чи буде це працювати для використання count(1)?
Фархан

Ви сер @Mat Traherne врятував мене :) Я отримав це, намагаючись зв'язати дані у файлі Excel, вже мав ISNULL (x, y), але це не спрацювало, однак "SUM (ВИПАДК, КОЛИ X НУЛЬКИЙ ТАК 0 ІНШІ X END) AS Z "працював чудово! Дякую!
Димитрій

20

Одним із способів вирішення цієї проблеми є вимкнення попереджень.

SET ANSI_WARNINGS OFF;
GO

30
З msdn це не тільки змінює попередження про нульове значення в сукупностях, але також змінює обробку помилок ділення на нуль та переповнення. Це призводить до того, що це рішення є для мене «забороною».
Фредерік,

3
Чому ти все одно вважаєш це проблемою? це просто інформаційно
Мартін Сміт

2
@Mukus - Ні, ні. Він друкує повідомлення на рівні серйозності 10. Що завгодно 10 або нижче, інформаційне не вважається помилкою. SELECT SUM(X) FROM (VALUES ( 1 + NULL)) V(X);SELECT 'This is executed fine';
Martin Smith

5
@RichieACC Так, оскільки це не відповідь, і відключення надзвичайно бажаних попереджень ANSI як ледачий спосіб уникнути одного інформаційного повідомлення призведе до поломки багатьох інших, явно неінформаційних речей.
underscore_d

3
Рішення для того, щоб увімкнули попереджувальні ліхтарі у вашому автомобілі, - просто відключити приладову панель. Це, мабуть, найгірша відповідь, яку я коли-небудь бачив на stackoverflow.
VoronoiPotato

17

Використання ISNULL(field, 0)Він також може використовуватися з агрегатами:

ISNULL(count(field), 0)

Однак ви можете розглянути можливість зміни count(field) to count(*)

Редагувати:

спробуйте:

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

я спробував, але (null) все ще існує в рядку. Як змінити це значення на 0, коли дані нульові?
Amin SCO

дякую, але значення не null також отримало ту ж проблему, коли null з'являється. як змінити значення на 0 ?.
Amin SCO

1
FYI: ISNULL(count(field), 0)не працював у мене в MSSQL 2008 R2. Проблема в тому, що я намагався порахувати поле в лівій зовнішній об’єднаній таблиці, щоб отримати кількість записів у об’єднаній таблиці, пов’язаних з основною таблицею. Мені довелося зробити підзапит, який внутрішньо приєднався до двох таблиць, щоб отримати підрахунок на ідентифікатор в основній таблиці. Підзапит був залишений зовнішнім, приєднаним до основної таблиці на ідентифікаторі. Потім підрахунок підзапиту обертався ISNULL, щоб отримати нульове значення 0 (без попереджувального повідомлення).
Триспід

1
Кріс, це має бути COUNT (ISNULL (поле, 0)), а не навпаки. Запитуючи поточний формат, буде повернуто лише 0, а не реальний рахунок. Логіка: Count (поле) поверне єдине NULL для всіх значень полів, які є нульовими, а ISNULL встановить це значення 0, повертаючи 0.
Govind Rai

9

Ви хочете розмістити ISNULLвсередині COUNTфункції, а не зовні:

Не добре: ISNULL(COUNT(field), 0)

ДОБРЕ: COUNT(ISNULL(field, 0))


12
Це неправильно. count(ISNULL(field, 0))буде еквівалентно count(*), оскільки підраховане значення більше не може бути NULL.

@hvd це не неправильно, значення дорівнює 0, коли поле є нульовим.
Govind Rai

3
@GovindRai Ні, це дійсно неправильно. Якщо ви вважаєте, що можете придумати контрприклад, приклад, де COUNT(ISNULL(field, 0))воно відрізняється COUNT(*), будь ласка, зробіть це, SQL Fiddle полегшує обмін таким контрприкладом. Але ти не зможеш. Оскільки COUNTпідраховує ненульові значення, навіть якщо вони дорівнюють нулю, і ISNULL(field, 0)завжди є ненульовим значенням, COUNT(ISNULL(field, 0))підраховує рядки. Це те, що COUNT(*)призначене, а не те, що було тут ОП.

2
@hvd Ви маєте рацію. Моя відповідь базувалася на group byзапиті, який відрізнявся від того, що було після ОП. У моєму випадку ISNULL(COUNT(field), 0)повернув би рахунок 0 для всіх значень NULL, що було неправильно, оскільки було кілька нульових значень, тоді як COUNT(ISNULL(field),0)повернув би правильний рахунок для загальної кількості значень NULL. Але знову ж таки, два абсолютно різних сценарії.
Govind Rai

Зробив це для роботи. Ось! sqlfiddle.com/#!3/ee0546/2 Проголосував за ваш коментар ха-ха
Govind Rai

-2

Я отримував цю помилку; Я просто додав WHEREпункт для поля, яке було використано в countпункті. це вирішило проблему. Примітка: якщо існує нульове значення, перевірте, чи є воно критичним для звіту, оскільки його виключено з підрахунку.

Старий запит:

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

Новий запит:

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

-3

Якщо в агрегатній функції існує якесь значення Null, ви зіткнетеся з цією проблемою. Замість коду нижче

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

використовувати як

SELECT Count(ISNULL(closed, 0))
  FROM   ticket
  WHERE  assigned_to = c.user_id
  AND closed IS NULL
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.