source

COUNT 집계에 "0"/"0" 결과를 포함시키는 방법은 무엇입니까?

ittop 2023. 5. 22. 21:41
반응형

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

반응형