COUNT 집계에 "0"/"0" 결과를 포함시키는 방법은 무엇입니까?
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_id를 person 테이블에서 가져오도록 문을 수정하면 다음과 같은 정보가 나타납니다.
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을 얻을 수 있습니다(vl 함수 덕분).
예:
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에서 Inner가 조인하므로 왼쪽 또는 오른쪽 조인으로 이동합니다.
기본 키가 포함된 테이블이 쿼리에서 먼저 언급된 경우 LEFT join을 사용하거나 RIGHT join을 사용합니다.
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
Primary 키가 있는 테이블에서 그룹화하고 실제 항목/세부 정보가 있는 다른 테이블에서 카운트합니다.
원래 쿼리를 더 적게 변경하려면 조인을 다음으로 전환할 수 있습니다.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;
언급URL : https://stackoverflow.com/questions/14793057/how-to-include-zero-0-results-in-count-aggregate
'source' 카테고리의 다른 글
데이터 테이블 정렬 (0) | 2023.05.22 |
---|---|
Eclipse에서 스페이스 바 키 누름이 자동 완성을 트리거하지 않도록 합니다. (0) | 2023.05.22 |
작동하지 않는 경우 Windows 배치 SET 내부 (0) | 2023.05.22 |
문자열 작성기에서 문자 제거 (0) | 2023.05.22 |
jQuery의 SELECT 요소에서 특정 옵션을 어떻게 선택합니까? (0) | 2023.05.22 |