如果存在日期,如何根据日期从sql获取总和日期?

时间:2019-09-29 13:17:08

标签: mysql sql sum

在我的应用中,我需要在满足以下条件的情况下提取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

1 个答案:

答案 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供应商)。