En mi aplicación, necesito obtener SUM(admin_amount) con la siguiente condición.

Tabla 1

Id, driver_id, admin_amount, trip_date

Tabla 2

Id, driver_id, from_date, to_date, amount, created_date

En la tabla 2, el administrador obtendrá el monto de la comisión del conductor según las fechas. Por ejemplo, el conductor tiene que pagar 1000 rupias al administrador por su comisión de viaje entre 2019-10-01 y 2019-10-10. Entonces, cuando el conductor viene a pagar al administrador en ese momento, necesito encontrar la cantidad total pendiente de controlador para pagar al administrador.

Lo que estoy intentando ...

Estoy tratando de obtener la fecha de la última transacción (created_date) de table2 para poder obtener la fecha del último pago y, en base a eso, puedo calcular SUM(admin_change) till now.

Puedo hacer esto a través de dos consultas.

1) Obtener la última fecha

SELECT * FROM  table2 
WHERE driver_id = 14 
ORDER BY created_date DESC 
LIMIT 1;

2) Si obtuve datos, use la fecha en la condición de lo contrario, obtenga SUM () de todos los datos.

¿Alguien puede ayudar a lograr esto en una sola consulta?

Probar

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);

Esta consulta funciona cuando existe algún dato, pero no funciona cuando table2 no tiene datos del controlador respectivo.

Tabla1

1, 33, 50, 2019-10-01
2, 33, 70, 2019-10-01
3, 33, 30, 2019-10-10

Tabla2

// Si es un controlador nuevo, todavía no hay transacción.

// Si la transacción anterior está allí, los datos serán como se muestra a continuación.

1, 33, 2019-10-01, 2019-10-10, 150, 2019-10-29
0
Sachin Shah 29 sep. 2019 a las 16:17

1 respuesta

La mejor respuesta

Según tengo entendido, cuando la subconsulta en la cláusula WHERE no devuelve nada (NULL), entonces no desea aplicar la condición trip_date >= (...). Puede usar COALESCE() en este caso para convertir el NULL devuelto a una fecha, que sea menor que cualquier valor posible en trip_date (por ejemplo, '1900-01-01'). En este caso, la condición siempre se evaluará como VERDADERA:

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');

Para combinarlo con la respuesta eliminada de Madhur Bhaiya, puede usar MAX(created_date) en la subconsulta.

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');

Esto no debería hacer ninguna diferencia, pero preferiría esto, porque es más corto y también más portátil (a lo largo de diferentes proveedores de DBMS).

3
Paul Spiegel 29 sep. 2019 a las 14:00