WITH
    temp AS (
        SELECT
            courier_id,
            sum(expense_amount) AS expense
        FROM
            expenses_info
        WHERE
            MONTH(expense_date) = 7
        GROUP BY
            courier_id
    )
SELECT
    courier_id,
    courier_name,
    base_salary + fee - expense AS total_income
FROM
    (
        SELECT DISTINCT
            a.courier_id,
            a.courier_name,
            a.base_salary,
            sum(b.delivery_fee) OVER (
                PARTITION BY
                    courier_id
            ) fee,
            temp.expense
        FROM
            couriers_info AS a
            INNER JOIN deliveries_info AS b ON a.courier_id = b.courier_id
            AND MONTH(b.delivery_date) = 7
            INNER JOIN temp ON temp.courier_id = a.courier_id
        ORDER BY
            courier_id ASC
    ) AS couriers_info_2
ORDER BY
    courier_id ASC

写的有点麻烦了但思路比较简单,这道题有一个点就是不要把三个表直接相连,要不然会出现很多重复项用DISTINCT也去不掉这样的话计算总和的时候就会错误,我的处理是先将两个表相连,剩下一个表先用GROUP BY进行处理再相连,最后处理数据就好了