with
    temp0 as (
        select
            br.book_id,
            count(*) as feb_2023_borrows
        from
            BorrowRecords br
            inner join Books b on br.book_id = b.book_id
        where
            year(borrow_date) = 2023
            and month(borrow_date) = 2
        group by
            br.book_id
    ),
    temp1 as (
        select
            br.book_id,
            count(*) as jan_2024_borrows
        from
            BorrowRecords br
            inner join Books b on br.book_id = b.book_id
        where
            year(borrow_date) = 2024
            and month(borrow_date) = 1
        group by
            br.book_id
    ),
    temp2 as (
        select
            br.book_id,
            count(*) as feb_2024_borrows
        from
            BorrowRecords br
            inner join Books b on br.book_id = b.book_id
        where
            year(borrow_date) = 2024
            and month(borrow_date) = 2
        group by
            br.book_id
    ),
    temp3 as (
        select
            br.book_id,
            ifnull(
                round(
                    100 * count(if(region = "华北", 1, null)) / count(*),
                    2
                ),
                0
            ) as north_pct_2023
        from
            BorrowRecords br
            inner join Books b on br.book_id = b.book_id
            inner join Branches bc on bc.branch_id = br.branch_id
        where
            year(borrow_date) = 2023
        group by
            br.book_id
    ),
    temp4 as (
        select
            br.book_id,
            ifnull(
                round(
                    100 * count(if(region = "华南", 1, null)) / count(*),
                    2
                ),
                0
            ) as south_pct_2023
        from
            BorrowRecords br
            inner join Books b on br.book_id = b.book_id
            inner join Branches bc on bc.branch_id = br.branch_id
        where
            year(borrow_date) = 2023
        group by
            br.book_id
    ),
    temp5 as (
        select
            br.book_id,
            ifnull(
                round(
                    100 * count(if(region = "华东", 1, null)) / count(*),
                    2
                ),
                0
            ) as east_pct_2023
        from
            BorrowRecords br
            inner join Books b on br.book_id = b.book_id
            inner join Branches bc on bc.branch_id = br.branch_id
        where
            year(borrow_date) = 2023
        group by
            br.book_id
    )
select
    b.book_id,
    book_title,
    ifnull(feb_2023_borrows, 0) as feb_2023_borrows,
    ifnull(feb_2024_borrows, 0) as feb_2024_borrows,
    ifnull(jan_2024_borrows, 0) as jan_2024_borrows,
    ifnull(feb_2024_borrows, 0) - ifnull(feb_2023_borrows, 0) as yoy_delta,
    ifnull(feb_2024_borrows, 0) - ifnull(jan_2024_borrows, 0) as mom_delta,
    ifnull(north_pct_2023, 0) as north_pct_2023,
    ifnull(south_pct_2023, 0) as south_pct_2023,
    ifnull(east_pct_2023, 0) as east_pct_2023
from
    Books b
    left join temp0 t0 on b.book_id = t0.book_id
    left join temp1 t1 on b.book_id = t1.book_id
    left join temp2 t2 on b.book_id = t2.book_id
    left join temp3 t3 on b.book_id = t3.book_id
    left join temp4 t4 on b.book_id = t4.book_id
    left join temp5 t5 on b.book_id = t5.book_id
order by
    b.book_id asc,
    book_title asc;