나는 약간의 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 인 사람과의 반환입니다!
어떤 제안을 부탁드립니다.
답변
이를 위해 외부 조인을 원합니다 (그리고 “운전”테이블로 사람을 사용해야 함)
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
답변
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;
답변
외부 조인 (카운트 포함)을 수행 한 다음이 결과를 하위 테이블로 사용하면 예상대로 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
답변
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
기본 키가있는 테이블에서 그룹을 가져오고 실제 항목 / 세부 정보가있는 다른 테이블에서 계산합니다.
답변
원래 쿼리에 덜 심지어 변경하려면, 당신은이에 가입하여 설정할 수 있습니다 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
방향에 있으므로 한 단어 만 추가하면되고 변경 사항은 줄어 듭니다. -거기에 있고 때로는 쿼리를 더 읽기 쉽게 만들고 재 구축이 덜 필요하다는 것을 기억하십시오.
답변
LEFT JOIN의 문제점은 약속이없는 경우에도 여전히 null이있는 행 하나를 반환하며, COUNT로 집계하면 1이되고 실제로 약속이없는 사람이 하나의 약속이있는 것처럼 보입니다. 나는 이것이 올바른 결과를 줄 것이라고 생각합니다.
SELECT person.person_id,
(SELECT COUNT(*) FROM appointment WHERE person.person_id = appointment.person_id) AS 'Appointments'
FROM person;