MySQL - SQL-запрос на выборку с двумя таблицами, использующими where, count и - PullRequest
0 голосов
/ 30 октября 2018

Есть две таблицы: client и contract.

таблица клиентов:

client_code INT pk
status      VARCHAR

У клиента может быть 1 или более контрактов. У клиента есть столбец состояния, в котором указано, есть ли у него действительные контракты - значения являются «активными» или «неактивными». Договор указан для клиента со статусом active .

таблица контрактов:

contract_code INT pk
client_code   INT pk
end_date      DATE

Контракт имеет конечную дату. Дата окончания контракта до сегодняшнего дня является истекшим контрактом.

ТРЕБОВАНИЕ: для отчета требуются все активные клиенты с контрактами, но со всеми (не некоторыми) контрактами, срок действия которых истек. Некоторые примеры данных приведены ниже:

Данные клиента:

client_code status
----------------------------------
1           active
2           inactive
3           active
4           active

Данные контракта:

contract_code   client_code   end_date
-------------------------------------------------------------
11              1             08-12-2018    
12              1             09-12-2018
13              1             10-12-2018
31              3             11-31-2018
32              3             10-30-2018
41              4             01-31-2019
42              4             12-31-2018

Ожидаемый результат:

client_code
-------------
1

РЕЗУЛЬТАТ: У этого клиента (client_code = 1) есть все контракты с истекшим сроком действия: 08-12-2018, 09-12-2018 и 10-12-2018.

Мне нужна помощь, чтобы написать запрос SQL, чтобы получить этот результат. Я не уверен, какие конструкции я должен использовать - можно указать, что я могу попробовать. База данных MySQL 5.5.

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

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

SELECT
    c.client_code
FROM client c
INNER JOIN contract co
    ON c.client_code = co.client_code
WHERE
    c.status = 'active'
GROUP BY
    c.client_code
HAVING
    SUM(CASE WHEN co.end_date > CURDATE() THEN 1 ELSE 0 END) = 0;

Демо

Примечание: я предполагаю, что ваши даты появляются в формате M-D-Y просто из-за определенного форматирования, и что end_date на самом деле является правильным столбцом даты. Если вместо этого вы сохраняете свои даты в виде текста, то нам, возможно, придется позвонить на STR_TO_DATE, чтобы сначала преобразовать их в даты.

0 голосов
/ 30 октября 2018

Это то, что вы ищете?

select clients.client_code
from clients
join contracts
on contracts.client_code=clients.client_code
where status='active'
group by clients.client_code
having min(end_date)>curdate() 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...