【发布时间】: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