Як включити результати "нуль" / "0" в сукупність COUNT?


112

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

У мене дві таблиці, одна називається людина, одна називається зустріч. Я намагаюся повернути кількість зустрічей у людини (в тому числі, якщо вони мають нуль). Зустріч містить person_idта є person_idзустріч на кожну зустріч. Це COUNT(person_id)розумний підхід.

Запит:

SELECT person_id, COUNT(person_id) AS "number_of_appointments" 
FROM appointment 
GROUP BY person_id;

Повернеться правильно, кількість зустрічей у людини. Однак особа, яка має 0 зустрічей, не повертається (очевидно, оскільки їх немає в цій таблиці).

Налаштування заяви про прийняття person_id з таблиці особи дає мені щось на кшталт:

SELECT person.person_id, COUNT(appointment.person_id) AS "number_of_appointments"
FROM appointment
JOIN person ON person.person_id = appointment.person_id
GROUP BY person.person_id;

Це, однак, все одно поверне лише особу, яка має зустріч, а не те, що я хочу, а це повернення з особами, які мають 0 зустрічей!

Будь-які пропозиції, будь ласка?


1
Що робити, якщо я хочу отримати нуль | 0 в результаті на одній таблиці. Я таблиця vm_tool_licenses і запит, як нижче, виберіть vm_tool_id, підрахунок (vm_tool_license_active) з групи vm_tool_licenses по vm_tool_license_active, vm_tool_id з vm_tool_license_active = false`
Narendra

Відповіді:


101

Ви хочете, щоб зовнішнє з'єднання для цього (і вам потрібно використовувати особу як "керуючу" таблицю)

SELECT person.person_id, COUNT(appointment.person_id) AS "number_of_appointments"
FROM person 
  LEFT JOIN appointment ON person.person_id = appointment.person_id
GROUP BY person.person_id;

Причина, чому це працює, полягає в тому, що зовнішнє (ліве) приєднання повернеться NULLдля тих осіб, які не мають зустрічі. Функція сукупності count()не буде рахувати NULLзначення, і, таким чином, ви отримаєте нуль.

Якщо ви хочете дізнатися більше про зовнішні приєднання, ось приємний підручник: http://sqlzoo.net/wiki/Using_Null


але що робити, якщо деякі поля призначення НЕ НУЛЬНІ (у визначенні таблиці)?
Lior Yehezkely

@LiorYehezkely: "деякі стовпці" не мають значення. Count () використовує стовпець приєднання. Якщо це не є нульовим, то є зустріч, яку слід порахувати
a_horse_with_no_name

21

Ви повинні використовувати LEFT JOINзамістьINNER JOIN

SELECT person.person_id, COUNT(appointment.person_id) AS "number_of_appointments"
FROM person 
LEFT JOIN appointment ON person.person_id = appointment.person_id
GROUP BY person.person_id;

1
GROUP BY здається помилковою помилкою в оригінальному запитанні, оскільки таблиця не включена в запит.
Йоахім Ісакссон

7

якщо ви зробите зовнішнє з'єднання (з підрахунком), а потім використовуєте цей результат як підтаблицю, ви можете отримати 0, як очікувалося (завдяки функції nvl)

Наприклад:

select P.person_id, nvl(A.nb_apptmts, 0) from 
(SELECT person.person_id
FROM person) P
LEFT JOIN 
(select person_id, count(*) as nb_apptmts
from appointment 
group by person_id) A
ON P.person_id = A.person_id

5

USE приєднуйтесь, щоб отримати 0 підрахунок результату, використовуючи GROUP BY.

просто "приєднуйтесь", чи Внутрішній приєднується до MS SQL, отже, переходьте ліворуч або праворуч.

Якщо таблиця, що містить первинний ключ, згадується спочатку в ПИТАННІ, тоді використовуйте лівий приєднатися інше ВПРАВО.

EG:

select WARDNO,count(WARDCODE) from MAIPADH 
right join  MSWARDH on MSWARDH.WARDNO= MAIPADH.WARDCODE
group by WARDNO

.

select WARDNO,count(WARDCODE) from MSWARDH
left join  MAIPADH on MSWARDH.WARDNO= MAIPADH.WARDCODE group by WARDNO

Візьміть групу з таблиці, в якій є Первинний ключ, і рахуйте з іншої таблиці, в якій є фактичні записи / деталі.


2

Щоб змінити ще менше свого оригінального запиту, ви можете перетворити своє об'єднання на RIGHTоб'єднання

SELECT person.person_id, COUNT(appointment.person_id) AS "number_of_appointments"
FROM appointment
RIGHT JOIN person ON person.person_id = appointment.person_id
GROUP BY person.person_id;

Це просто спирається на обрану відповідь, але оскільки зовнішнє з'єднання йде в RIGHTнапрямку, потрібно додати лише одне слово і менше змін. - Пам'ятайте лише, що він є, а іноді може зробити запити більш читабельними та вимагати меншої перебудови.


0

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

SELECT person.person_id,
(SELECT COUNT(*) FROM appointment WHERE person.person_id = appointment.person_id) AS 'Appointments'
FROM person;

Я просто збирався розмістити це саме рішення, дуже просте.
Джоел
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.