SQL 结果中未显示空值

SQL null values not being shown in results

我在获取 SQL 查询的空值时遇到问题。这是问题的描述:

Gross income by week. Money is collected from guests when they leave. For each Thursday in November and December 2016, show the total amount of money collected from the previous Friday to that day, inclusive.

这是我编写的代码,应该 return 从星期四到上星期五的每周收入,我得到的答案是部分正确的,因为正确显示了有收入的周,而没有收入的周'有任何收入都不显示。我已经尝试添加一个 IFNULL 子句,但仍然没有解决问题。

SELECT DATE_ADD(MAKEDATE(2016, 7), INTERVAL WEEK(DATE_ADD(calendar.i, INTERVAL booking.nights - 5 DAY), 0) WEEK) AS Thursday, IFNULL(SUM(booking.nights * rate.amount) + SUM(e.amount),0) AS weekly_ncome
FROM booking
RIGHT OUTER
JOIN calendar ON booking.booking_date = calendar.i
JOIN rate ON (booking.occupants = rate.occupancy AND booking.room_type_requested = rate.room_type)
LEFT JOIN (
    SELECT booking_id, IFNULL(SUM(amount),0) AS amount
    FROM extra
    GROUP BY booking_id
) AS e ON (e.booking_id = booking.booking_id)
GROUP BY Thursday;

作为参考,这是在 SQLzoo Guesthouse section, question 15 上找到的问题。这是预期的结果:

+------------+---------------+
| Thursday   | weekly_income |
+------------+---------------+
| 2016-11-03 |          0.00 |
| 2016-11-10 |      12608.94 |
| 2016-11-17 |      13552.56 |
| 2016-11-24 |      12929.69 |
| 2016-12-01 |      11685.14 |
| 2016-12-08 |      13093.79 |
| 2016-12-15 |       8975.87 |
| 2016-12-22 |       1395.77 |
| 2016-12-29 |          0.00 |
| 2017-01-05 |          0.00 |
+------------+---------------+

我和上面一样,但是周收入为0的没有出现。

这是获取 2016 年 11 月和 2016 年 12 月星期四的一种方法:

    SELECT i AS thursday, i - INTERVAL 6 DAY AS friday
    FROM calendar
    WHERE i >= '2016-11-01' AND i - INTERVAL 6 DAY <= '2016-12-31' AND DAYOFWEEK(i) = 5

刚刚离开加入你的数据,确保加入结帐日期(booking_date + 晚天):

SELECT
    thursday, SUM(
        COALESCE(booking.nights * rate.amount, 0) +
        COALESCE(extras.total, 0)
    ) AS weekly_income
FROM (
    SELECT i AS thursday, i - INTERVAL 6 DAY AS friday
    FROM calendar
    WHERE i >= '2016-11-01' AND i - INTERVAL 6 DAY <= '2016-12-31' AND DAYOFWEEK(i) = 5
) AS thursdays
LEFT JOIN (
    booking
    INNER JOIN rate ON booking.occupants = rate.occupancy AND booking.room_type_requested = rate.room_type
    LEFT JOIN (
        SELECT booking_id, SUM(amount) AS total
        FROM extra
        GROUP BY booking_id
    ) AS extras ON booking.booking_id = extras.booking_id
) ON booking.booking_date + INTERVAL booking.nights DAY BETWEEN friday AND thursday
GROUP BY thursday