在我的应用中,我需要在满足以下条件的情况下提取SUM(admin_amount)
。
表1
id,driver_id,admin_amount,trip_date
表2
id,driver_id,from_date,to_date,金额,创建日期
在表2中,管理员将基于日期从驱动程序中获取他的佣金金额。例如,驾驶员必须在2019-10-01至2019-10-10之间支付1000卢比的管理费。因此,当驾驶员当时要付钱给管理员时,我需要找到要付钱的驾驶员的未决总金额。
我正在尝试...
我正试图从table2
获取最近的交易日期(created_date),以便获得最近一次付款的日期,并据此计算出SUM(admin_change) till now
。
我可以通过两个查询来做到这一点。
1)获取最后日期
SELECT * FROM table2
WHERE driver_id = 14
ORDER BY created_date DESC
LIMIT 1;
2)如果我得到了数据,请使用日期,否则可以简单地获取所有数据的SUM()。
任何人都可以在单个查询中帮助实现这一目标吗?
尝试
SELECT SUM(admin_amount)
FROM table1
WHERE driver_id = 33
AND trip_date >= (SELECT created_date
from table2
WHERE driver_id = 33
ORDER by created_date DESC
LIMIT 1);
该查询在存在任何数据时起作用,但在table2没有相应驱动程序的数据时不起作用。
表1
1, 33, 50, 2019-10-01
2, 33, 70, 2019-10-01
3, 33, 30, 2019-10-10
表2
//如果是新驱动程序,则还没有事务。
//如果存在先前的事务,则数据将如下所示。
1, 33, 2019-10-01, 2019-10-10, 150, 2019-10-29
答案 0 :(得分:3)
据我了解-当WHERE子句中的子查询不返回任何内容(NULL
)时,您就不想应用条件trip_date >= (...)
。在这种情况下,您可以使用COALESCE()
将返回的NULL
转换为一个日期,该日期应小于trip_date
中的任何可能值(例如'1900-01-01'
)。在这种情况下,条件将始终被评估为TRUE:
SELECT SUM(admin_amount)
FROM table1
WHERE driver_id = 33
AND trip_date >= COALESCE((
SELECT created_date
from table2
WHERE driver_id = 33
ORDER by created_date DESC
LIMIT 1
), '1900-01-01');
要将其与Madhur Bhaiya删除的答案结合使用,可以在子查询中使用MAX(created_date)
。
SELECT SUM(admin_amount)
FROM table1
WHERE driver_id = 33
AND trip_date >= COALESCE((
SELECT MAX(created_date)
from table2
WHERE driver_id = 33
), '1900-01-01');
这应该没什么区别-但是我更喜欢这样做,因为它更短并且更便于携带(以及其他DBMS供应商)。