Нулевые значения SQL не отображаются в результатах - PullRequest
0 голосов
/ 19 ноября 2018

У меня проблемы с получением нулевых значений в SQL-запросе. Это описание проблемы:

Валовой доход за неделю. Деньги собираются с гостей, когда они уходят. За каждый четверг в ноябре и декабре 2016 года показывайте общую сумму денег, собранных с прошлой пятницы по этот день включительно.

Вот код, который я написал, который должен возвращать еженедельный доход с четверга до предыдущей пятницы, ответ, который я получаю, является частично правильным, так как недели, у которых есть доход, отображаются правильно, а недели, у которых нет дохода, не отображается Я попытался добавить предложение 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, вопрос 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, не отображаются.

Database diagram

1 Ответ

0 голосов
/ 20 ноября 2018

Вот один из способов получить четверг в ноябре 2016 года и декабре 2016 года:

    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 + night days):

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