"zero"/ "0"을 포함하면 COUNT 집계가 생성됩니까?


112

나는 약간의 SQL에 약간 붙어 있습니다. 질문을 훌륭하게 표현할 수 없을 것 같으니 보여 드리겠습니다.

두 개의 테이블이 있는데, 하나는 사람, 하나는 약속입니다. 한 사람이 가진 약속 수를 반환하려고합니다 (0이있는 경우 포함). 약속은을 포함 person_id하고 있습니다 person_id당 약속. 따라서 COUNT(person_id)합리적인 접근 방식입니다.

쿼리 :

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

person_id가 가진 약속 수를 올바르게 반환합니다. 그러나 약속이 0 인 사람은 반환되지 않습니다 (분명히 해당 테이블에 없음).

person 테이블에서 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;

그러나 이것은 여전히 ​​약속이있는 person_id 만 반환하고 내가 원하는 것이 아닌 약속이 0 인 사람과의 반환입니다!

어떤 제안을 부탁드립니다.


1
0을 얻으려면 어떻게합니까 | 단일 테이블의 결과로 0. 내가 vm_tool_licenses 테이블을했습니다 및 쿼리가 vm_tool_license_active에 의해 vm_tool_licenses 그룹에서 선택 vm_tool_id, 수 (vm_tool_license_active) 아래처럼, vm_tool_id 가진 vm_tool_license_active = FALSE '
나렌드라

답변:


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값을 계산하지 않으므로 0이됩니다.

외부 조인에 대해 더 배우고 싶다면 여기 좋은 튜토리얼이 있습니다 : http://sqlzoo.net/wiki/Using_Null


그러나 약속의 일부 필드가 NULL이 아니면 (테이블 정의에서) 어떻게 될까요?
Lior Yehezkely

@LiorYehezkely : "일부 열"은 중요하지 않습니다. count ()는 조인 열을 사용합니다. 이것이 null이 아니라면 계산해야 할 약속이 있습니다
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는 원래 질문의 오타처럼 보입니다.
Joachim Isaksson

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

GROUP BY를 사용하여 결과에서 0 카운트를 얻으려면 조인을 사용하십시오.

단순히 'join'은 MS SQL에서 내부 조인을 수행하므로 왼쪽 또는 오른쪽 조인으로 이동합니다.

기본 키를 포함하는 테이블이 QUERY에서 먼저 언급되면 LEFT 조인을 사용하고 RIGHT 조인을 사용하십시오.

예 :

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

LEFT JOIN의 문제점은 약속이없는 경우에도 여전히 null이있는 행 하나를 반환하며, COUNT로 집계하면 1이되고 실제로 약속이없는 사람이 하나의 약속이있는 것처럼 보입니다. 나는 이것이 올바른 결과를 줄 것이라고 생각합니다.

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

이 솔루션을 매우 간단하게 게시하려고했습니다.
Joel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.