【问题标题】:SQL null values not being shown in results结果中未显示 SQL 空值
【发布时间】:2018-11-19 12:22:20
【问题描述】:

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

按周计算的总收入。客人离开时会向客人收取钱款。 对于 2016 年 11 月和 12 月的每个星期四,显示总金额 从上周五到当天收的钱,包括在内。

这是我编写的代码,应该返回从周四到上周五的每周收入,我得到的答案部分正确,因为正确显示了有收入的周,而没有任何收入的周是不显示。我已经尝试添加一个 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 的人没有出现。

【问题讨论】:

  • OUTER JOIN 一个包含所有可能的星期/日期的日历表。
  • 发布示例数据并标记您正在使用的数据库
  • @jarlh 我将代码更改为外部加入日历,但我仍然没有得到正确的结果。我是否错误地加入了他们?
  • @SalmanA 我添加了我一直在使用的数据库
  • 把右连接放在最后。

标签: sql date datetime mariadb outer-join


【解决方案1】:

这是获取 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

刚刚离开加入您的数据,请确保您加入结帐日期(预订日期+夜晚天数):

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

【讨论】:

    猜你喜欢
    • 2015-08-31
    • 2017-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    • 2022-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多