복붙노트

[SQL] 어떻게 COUNT 집계에서 "제로"/ "0"을 포함하는?

SQL

어떻게 COUNT 집계에서 "제로"/ "0"을 포함하는?

난 그냥 조금 일부 SQL 붙어 자신을 가지고있다. 그래서 내가 당신을 보여 드리죠 - 나는 훌륭하게 표현 질문을 할 수 있다고 생각하지 않습니다.

나는 두 테이블, 하나라는 사람이 하나라는 약속이있다. 나는 사람이 (가 제로가있는 경우 포함) 한 약속의 수를 반환하기 위해 노력하고있어. 약속은 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로 취할 수있는 문을 미세 조정하는 것은 나에게 뭔가를 제공합니다 :

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. ==============================

    1.당신은 바깥이 조인 (그리고 당신이 "운전"테이블로 사람을 사용해야합니다)합니다

    당신은 바깥이 조인 (그리고 당신이 "운전"테이블로 사람을 사용해야합니다)합니다

    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을 반환에 참여한다는 것입니다. 집계 함수의 수는 () NULL 값을 계산하지 않습니다 따라서 당신은 0을 얻을 것이다.

    당신이 외부 조인에 대해 더 배우고 싶은 경우에, 여기에 좋은 튜토리얼은 다음과 같습니다 http://sqlzoo.net/wiki/Using_Null

  2. ==============================

    2.당신은 가입 가입 대신 INNER LEFT를 사용해야합니다

    당신은 가입 가입 대신 INNER LEFT를 사용해야합니다

    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;
    
  3. ==============================

    3.당신이 외부 (개수로)에 가입 한 후 하위 테이블로이 결과를 사용하는 경우합니다 (NVL 기능 덕분에) 예상대로, 당신은 공을 얻을 수 있습니다

    당신이 외부 (개수로)에 가입 한 후 하위 테이블로이 결과를 사용하는 경우합니다 (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
    
  4. ==============================

    4.사용은 GROUP BY를 사용하여 결과 0 수를 얻기 위해 가입 할 수 있습니다.

    사용은 GROUP BY를 사용하여 결과 0 수를 얻기 위해 가입 할 수 있습니다.

    단순히 '참여'내부 왼쪽 또는 오른쪽 조인, 그래서 MS SQL에서 이동을 가입한다.

    기본 키가 들어있는 테이블이 쿼리에서 처음 언급되고있는 경우 RIGHT 가입 다른 조인 LEFT를 사용합니다.

    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
    

    실제 항목 / 세부 사항이있는 다른 테이블의 기본 키와 수를 가지고있는 테이블로 그룹을 가져 가라.

  5. ==============================

    5.원래 쿼리에 덜 심지어 변경하려면 조인 RIGHT에 가입하여 설정할 수 있습니다

    원래 쿼리에 덜 심지어 변경하려면 조인 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;
    

    이것은 단지 선택한 답변을 기반으로하지만, 외부 조인으로 하나의 단어 요구가 추가 적은 변화 할 올바른 방향입니다. - 그냥 거기 때로는 쿼리를 더 읽기 쉽게 적은 재건 요구할 수 있음을 기억하십시오.

  6. ==============================

    6.왼쪽 가입에 대한 문제는 어떤 약속이 없을 경우, 여전히 1이 될 것이다 COUNT 집계 널, 하나 개의 행을 반환하고, 실제로 그들은 아무도 없어 때 사람이 한 약속을 가지고 나타날 것입니다. 나는 이것이 올바른 결과를 얻을 생각 :

    왼쪽 가입에 대한 문제는 어떤 약속이 없을 경우, 여전히 1이 될 것이다 COUNT 집계 널, 하나 개의 행을 반환하고, 실제로 그들은 아무도 없어 때 사람이 한 약속을 가지고 나타날 것입니다. 나는 이것이 올바른 결과를 얻을 생각 :

    SELECT person.person_id,
    (SELECT COUNT(*) FROM appointment WHERE person.person_id = appointment.person_id) AS 'Appointments'
    FROM person;
    
  7. from https://stackoverflow.com/questions/14793057/how-to-include-zero-0-results-in-count-aggregate by cc-by-sa and MIT license