Câu hỏi Cách bao gồm kết quả “không” / “0” trong COUNT tổng hợp?


Tôi đã có bản thân mình một chút bị mắc kẹt với một số SQL. Tôi không nghĩ rằng tôi có thể cụm từ câu hỏi một cách tuyệt vời - vì vậy hãy để tôi chỉ cho bạn.

Tôi có hai bàn, một người được gọi là người, một người được gọi là cuộc hẹn. Tôi đang cố trả lại số cuộc hẹn mà một người có (kể cả nếu họ có số không). Cuộc hẹn có chứa person_id và có một person_id mỗi cuộc hẹn. Vì thế 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ả lại chính xác, số lượng cuộc hẹn mà 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 ở trong bảng đó).

Tinh chỉnh câu lệnh để lấy person_id từ bảng người 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ả lại một người có cuộc hẹn và không phải là điều tôi muốn, đó là sự trở lại với những người có 0 cuộc hẹn!

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


76
2018-02-09 23:59


gốc




Các câu trả lời:


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

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 là làm việc, là bên ngoài (trái) tham gia sẽ trở lại NULL cho những người không có hẹn. Hàm tổng hợp count() sẽ không được tính NULL các giá trị và do đó bạn sẽ nhận được một số không.

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


67
2018-02-10 00:04





Bạn phải dùng LEFT JOIN thay 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;

17
2018-02-10 00:03



THE GROUP BY có vẻ 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
@ JoachimIsaksson Sai lầm của tôi. Tất nhiên :) - Hamlet Hakobyan


nếu bạn thực hiện phép nối ngoài (với số đếm), và sau đó 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ờ vào 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

4
2018-01-20 13:30





USE tham gia để có được số lượng 0 trong kết quả bằng cách sử dụng GROUP BY.

chỉ đơn giản là 'tham gia' làm Inner tham gia trong MS SQL như vậy, Go cho tham gia trái hoặc phải.

Nếu bảng chứa khóa chính được đề cập đầu tiên trong QUERY, sau đó sử dụng LEFT join else RIGHT join.

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

Hãy nhóm theo từ bảng có khóa chính và đếm từ bảng khác có mục / chi tiết thực tế.


2
2017-11-09 10:55





Để thay đổi ít hơn cho truy vấn ban đầu của bạn, bạn có thể biến tham gia của mình thành RIGHT tham 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ỉ xây dựng trên câu trả lời đã chọn, nhưng khi kết nối bên ngoài nằm trong RIGHT hướng, chỉ cần thêm một từ và ít thay đổi hơn. - 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à yêu cầu ít xây dựng lại.


0
2018-06-28 12:21