source

테이블 내의 각 외부 키 ID 인스턴스 수를 카운트하려면 어떻게 해야 합니까?

goodcode 2022. 9. 8. 21:51
반응형

테이블 내의 각 외부 키 ID 인스턴스 수를 카운트하려면 어떻게 해야 합니까?

여기 간단한 SQL 질문이 있습니다.

테이블이 두 개 있습니다.

책들

-------------------------------------------------------
| book_id | author | genre | price | publication_date |
-------------------------------------------------------

주문

------------------------------------
| order_id | customer_id | book_id |
------------------------------------

다음을 반환하는 쿼리를 만들고 싶습니다.

--------------------------------------------------------------------------
| book_id | author | genre | price | publication_date | number_of_orders |
--------------------------------------------------------------------------

즉, 각 책이 주문 테이블에 나타나는 횟수를 카운트하는 'number_of_orders'라는 계산 컬럼과 함께 Books 테이블의 모든 행에 대한 모든 열을 반환합니다.(주문 테이블에 장부가 없는 경우 결과 세트에 장부가 표시되지만 "number_of_orders"는 0이어야 합니다.

지금까지 제가 생각해낸 건

SELECT
    books.book_id,
    books.author,
    books.genre,
    books.price,
    books.publication_date,
    count(*) as number_of_orders
from books
left join orders
on (books.book_id = orders.book_id)
group by
    books.book_id,
    books.author,
    books.genre,
    books.price,
    books.publication_date

이는 거의 맞지만 완전히 맞지는 않습니다.책자가 Orders 테이블에 나열되지 않더라도 "number_of_orders"는 1이 되기 때문입니다.또한 SQL에 대한 지식이 부족하기 때문에 이 쿼리는 매우 비효율적이라고 확신합니다.

이 쿼리를 작성하는 올바른 방법은 무엇입니까?(내SQL에서 작동해야 하므로 다른 벤더별 기능은 사용할 수 없습니다).

잘 부탁드립니다!

당신의 질문은 거의 정확하며, 그것이 그것을 위한 올바른 방법(그리고 가장 효율적인 방법)입니다.

SELECT books.*, count(orders.book_id) as number_of_orders        
from books
left join orders
on (books.book_id = orders.book_id)
group by
    books.book_id

COUNT(*)는 모든 행을 카운트하기 때문에 카운트에 NULL 값을 포함할 수 있습니다.COUNT(orders.book_id)는 지정된 필드의 NULL 값을 무시하기 때문에 그렇지 않습니다.

SELECT b.book_id,
    b.author,
    b.genre,
    b.price,
    b.publication_date,
    coalesce(oc.Count, 0) as number_of_orders
from books b
left join (
    select book_id, count(*) as Count 
    from Order 
    group by book_id
) oc on (b.book_id = oc.book_id)

바꾸다count(*)로.count(orders.book_id)

잘못 세고 있어null이 아닌 book_id를 카운트합니다.

SELECT
    books.book_id,
    books.author,
    books.genre,
    books.price,
    books.publication_date,
    count(orders.book_id) as number_of_orders
from books
left join orders
on (books.book_id = orders.book_id)
group by
    books.book_id,
    books.author,
    books.genre,
    books.price,
    books.publication_date
select author.aname,count(book.author_id) as "number_of_books"
from author 
left join book 
on(author.author_id=book.author_id)
GROUP BY author.aname;

언급URL : https://stackoverflow.com/questions/7424913/how-to-count-the-number-of-instances-of-each-foreign-key-id-in-a-table

반응형