Làm cách nào để đưa kết quả “không” / “0” vào COUNT tổng hợp?


112

Tôi chỉ gặp một chút khó khăn với một số SQL. Tôi không nghĩ mình có thể diễn đạt câu hỏi một cách xuất sắc - vậy hãy để tôi chỉ cho bạn.

Tôi có hai bàn, một người được gọi, một người được gọi là cuộc hẹn. Tôi đang cố gắng trả lại số cuộc hẹn mà một người có (bao gồm cả nếu họ có số 0). Cuộc hẹn bao gồm person_idvà có một person_idcuộc hẹn. Vì vậy, COUNT(person_id)là một cách tiếp cận hợp lý.

Truy vấn:

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

Sẽ trả về chính xác số cuộc hẹn mà một person_id có. Tuy nhiên, một người có 0 cuộc hẹn không được trả lại (rõ ràng là họ không có trong bảng đó).

Việc chỉnh sửa câu lệnh để lấy person_id từ bảng person cho tôi một cái gì đó như:

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;

Tuy nhiên, điều này sẽ vẫn chỉ trả về một person_id đã có cuộc hẹn chứ không phải điều tôi muốn, đó là trả về với những người có 0 cuộc hẹn!

Bất kỳ đề nghị xin vui lòng?


1
Điều gì xảy ra nếu tôi muốn nhận về số 0 | Kết quả là 0 trên một bảng. Tôi có bảng vm_tool_licenses và truy vấn giống như bên dưới chọn vm_tool_id, đếm (vm_tool_license_active) từ nhóm vm_tool_licenses theo vm_tool_license_active, vm_tool_id có vm_tool_license_active = false`
Narendra

Câu trả lời:


101

Bạn muốn một liên kết bên ngoài cho điều này (và bạn cần sử dụng người làm bảng "lái xe")

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;

Lý do tại sao điều này đang hoạt động, là tham gia bên ngoài (bên trái) sẽ trở lại NULLcho những người không có cuộc hẹn. Hàm tổng hợp count()sẽ không đếm NULLcác giá trị và do đó bạn sẽ nhận được số không.

Nếu bạn muốn tìm hiểu thêm về các phép nối ngoài, đây là một hướng dẫn hay: http://sqlzoo.net/wiki/Using_Null


nhưng nếu một số trường của cuộc hẹn KHÔNG ĐẦY ĐỦ (trong định nghĩa bảng) thì sao?
Lior Yehez Có thể

@LiorYeheztyles: "một số cột" không quan trọng. Số đếm () sử dụng cột nối. Nếu điều đó không phải là rỗng, thì có một cuộc hẹn sẽ được tính
a_horse_with_no_name

21

Bạn phải sử dụng LEFT JOINthay vì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 có vẻ giống như một lỗi đánh máy trong câu hỏi ban đầu vì bảng không được bao gồm trong truy vấn.
Joachim Isaksson

7

nếu bạn thực hiện phép nối ngoài (với số đếm), rồi sử dụng kết quả này làm bảng phụ, bạn có thể nhận được 0 như mong đợi (nhờ hàm nvl)

Ví dụ:

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

SỬ DỤNG phép nối để nhận số 0 trong kết quả bằng cách sử dụng GROUP BY.

chỉ đơn giản là 'tham gia' bên trong tham gia vào MS SQL, vì vậy, hãy tham gia trái hoặc phải.

Nếu bảng có chứa khóa chính được đề cập đầu tiên trong QUERY thì hãy sử dụng phép nối TRÁI khác phép nối PHẢI.

VÍ DỤ:

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

Lấy nhóm từ bảng có khóa chính và đếm từ bảng khác có mục nhập / chi tiết thực tế.


2

Để thay đổi ít hơn truy vấn ban đầu của bạn, bạn có thể biến tham gia của mình thành RIGHTtham gia

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;

Điều này chỉ dựa trên câu trả lời đã chọn, nhưng vì phép nối bên ngoài RIGHTtheo hướng, chỉ cần thêm một từ và ít thay đổi. - Chỉ cần nhớ rằng nó ở đó và đôi khi có thể làm cho các truy vấn dễ đọc hơn và ít yêu cầu xây dựng lại hơn.


0

Vấn đề với LEFT JOIN là nếu không có cuộc hẹn nào, nó vẫn sẽ trả về một hàng có giá trị rỗng, khi được tổng hợp bởi COUNT sẽ trở thành 1 và có vẻ như một người có một cuộc hẹn khi thực sự họ không có cuộc hẹn nào. Tôi nghĩ điều này sẽ cho kết quả chính xác:

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

Tôi sẽ đăng cùng một giải pháp này, rất đơn giản.
Joel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.