Как получить сумму даты из sql на основе даты, если дата существует? - PullRequest
0 голосов
/ 29 сентября 2019

В моем приложении мне нужно получить SUM(admin_amount) с условием ниже.

Таблица 1

id, идентификатор_драйвера, admin_amount, trip_date

Таблица 2

id, идентификатор_драйвера, from_date, to_date, сумма, create_date

В таблице 2, администратор будет получать свою комиссию от водителя на основе дат.Например, Водитель должен заплатить 1000 рупий администратору за его комиссию за поездку с 2019-10-01 по 2019-10-10.Поэтому, когда водитель приходит, чтобы заплатить администратору в то время, мне нужно найти общее количество ожидающих драйверов, чтобы заплатить администратору.

Что я пытаюсь ...

Я пытаюсь получить дату последней транзакции (create_date) из table2, чтобы я мог получить дату последнего платежа и на основании этого яможно рассчитать 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);

Этот запрос работает, когда какие-либо данные существуют, но не работает, когдаТаблица2 не имеет данных соответствующего драйвера.

Table1

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

Table2

// Если новый драйвер, то транзакции еще нет.

// Если есть предыдущая транзакция, тогда данные будут такими, как показано ниже.

1, 33, 2019-10-01, 2019-10-10, 150, 2019-10-29

1 Ответ

3 голосов
/ 29 сентября 2019

Как я понимаю - если подзапрос в предложении WHERE ничего не возвращает (NULL), тогда вы не хотите применять условие trip_date >= (...).В этом случае вы можете использовать COALESCE() для преобразования возвращенного значения NULL в дату, которая меньше любого возможного значения в trip_date (например, '1900-01-01').В этом случае условие всегда будет оцениваться как ИСТИНА:

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

Чтобы объединить его с удаленным ответом Мадхура Бхайи, вы можете использовать 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');

ThisНе должно быть никаких различий - но я бы предпочел это, потому что он короче, а также более переносим (у разных поставщиков СУБД).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...