SQL-запрос для данных с несколькими условиями

#mysql #sql #fraud-prevention

Вопрос:

Я пытаюсь найти способ создать запрос, который возвращает транзакции от физических лиц, когда они отправляют транзакции, которые традиционно сопровождаются другими транзакциями.

Пример (с приведенными ниже данными):

Мы видим, что у сотрудников был куплен рейс (с датой покупки рейса). Затем они представили сборы за багаж с датами транзакций, которые совпадают либо с датой вылета, либо с датой возвращения. Затем мы видим, что они отправили третье письмо, которое не соответствует ни одной из дат авиакомпании.

Есть ли способ идентифицировать каждого человека, с которого взимается плата за провоз багажа, если у него есть дата вылета/возвращения авиакомпании, соответствующая дате транзакции? В приведенном ниже примере последние сборы за багаж для каждого сотрудника-это строки, которые я надеюсь вернуть, поскольку они не соответствуют дате вылета/возвращения для соответствующих рейсов.

ИМЯ БД = подлежащее расходованию

Работник Тип Дата транзакции Уезжать Возврат
123 Авиакомпания 12052019 12082019 12132019
123 Багаж 12082019 нулевой нулевой
123 Багаж 12132019 нулевой нулевой
123 Багаж 12252019 нулевой нулевой
567 Авиакомпания 11052020 11082020 11132020
567 Багаж 11082020 нулевой нулевой
567 Багаж 11132020 нулевой нулевой
567 Багаж 11252020 нулевой нулевой

Комментарии:

1. Пожалуйста, объясните, что такое «мошенническая транзакция», или уберите это из вопроса. Кроме того, SQL не выделяет строки. Запрос просто возвращает строки. Какой набор результатов вы хотите получить?

2. Пожалуйста, не кричите в названии. Это очень раздражает.

3. @GordonLinoff спасибо, обновил вопрос.

4. @tadman приношу извинения и хорошо подмечаю. Ошибка новичка с моей стороны. Я обновил приглашение.

Ответ №1:

Я думаю, вы могли бы использовать «ГДЕ НЕ СУЩЕСТВУЕТ», чтобы сделать то, что вы ищете. Что-то вроде этого:

 SELECT *
FROM Transactions T1
WHERE T1.Type = 'Baggage'
AND NOT EXISTS ( 
    SELECT *
    FROM Transactions T2
    WHERE T2.Type = 'Airline'
        AND (T1.TransactionDate = T2.Depart OR T1.TransationDate = T2.Arrive)
    )
 

НЕ СУЩЕСТВУЕТ исключает любые записи о багаже, которые имеют соответствующую запись авиакомпании, основанную либо на дате вылета, либо на дате прибытия. (Помещение СУЩЕСТВУЕТ само по себе сделало бы opposite…it будут отображаться только операции с багажом, соответствующие операциям авиакомпании.) Вероятно, вы могли бы сделать это с помощью объединения, но EXISTS/NOT EXISTS-это хорошо, потому что это не дает вам повторяющихся строк в вашем результирующем наборе.

Комментарии:

1. Я попробовал предложенный код, но он не вернул никаких значений. Когда вы пишете «ИЗ Trasnactions T1, ГДЕ T1.Type = «Багаж»», что это делает? Я предполагаю, что он создает таблицу только со строками багажа? Затем мы пытаемся взять дату транзакции и сопоставить даты вылета/возвращения авиакомпании в подзапросе, возвращая строки, которые не совпадают? Я ввел свой ИЗ [вставить имя базы данных] , где Тип = багаж. Я предполагаю, что в моей версии отсутствует один шаг?

2. Это мое предположение о том, как называются ваши столы. На самом деле я не знаю, что у вас есть таблица под названием «Транзакции».

3. сработало! огромное спасибо за помощь! Мне пришлось изменить способ, которым я называл свою таблицу. Очень ценю вашу помощь @Jim