Я пытаюсь выполнить запрос между двумя разными таблицами и составить сценарий для каждого конкретного случая, составив список записей вызовов за определенный месяц.
Вот мои таблицы:
Таблица клиентов:
+----+----------------+------------+
| id | name | number |
+----+----------------+------------+
| 1 | John Doe | 8973221232 |
| 2 | American Dad | 7165531212 |
| 3 | Michael Clean | 8884731234 |
| 4 | Samuel Gatsby | 9197543321 |
| 5 | Mike Chat | 8794029819 |
+----+----------------+------------+
Данные транзакции:
+----------+------------+------------+----------+---------------------+
| trans_id | incoming | outgoing | duration | date_time |
+----------+------------+------------+----------+---------------------+
| 1 | 8973221232 | 9197543321 | 64 | 2018-03-09 01:08:09 |
| 2 | 3729920490 | 7651113929 | 276 | 2018-07-20 05:53:10 |
| 3 | 8884731234 | 8973221232 | 382 | 2018-05-02 13:12:13 |
| 4 | 8973221232 | 9234759208 | 127 | 2018-07-07 15:32:30 |
| 5 | 7165531212 | 9197543321 | 852 | 2018-08-02 07:40:23 |
| 6 | 8884731234 | 9833823023 | 774 | 2018-07-03 14:27:52 |
| 7 | 8273820928 | 2374987349 | 120 | 2018-07-06 05:27:44 |
| 8 | 8973221232 | 9197543321 | 79 | 2018-07-30 12:51:55 |
| 9 | 7165531212 | 7651113929 | 392 | 2018-05-22 02:27:38 |
| 10 | 5423541524 | 7165531212 | 100 | 2018-07-21 22:12:20 |
| 11 | 9197543321 | 2983479820 | 377 | 2018-07-20 17:46:36 |
| 12 | 8973221232 | 7651113929 | 234 | 2018-07-09 03:32:53 |
| 13 | 7165531212 | 2309483932 | 88 | 2018-07-16 16:22:21 |
| 14 | 8973221232 | 8884731234 | 90 | 2018-09-03 13:10:00 |
| 15 | 3820838290 | 2093482348 | 238 | 2018-04-12 21:59:01 |
+----------+------------+------------+----------+---------------------+
Что я пытаюсь сделатьвыполнить?
Я пытаюсь составить список «затрат» для каждого из клиентов, совершивших звонки в июле 2018 года. Расходы основаны на:
1) Есликлиент получил вызов (входящий), стоимость вызова равна продолжительности;
2) если клиент совершил вызов (исходящий), стоимость вызова составляет 100, если вызов составляет 30или меньше по продолжительности.Если продолжительность превышает 30, то стоимость составляет 100 плюс 5 * длительности превышенного периода.
Если клиент не совершал никаких звонков в течение этого месяца, он не должен быть в списке.
Примеры:
1) Клиент American Dad имеет 3 входящих звонка и 1 исходящий звонок, однако только trans_id 10 и 13 относятся к июлю месяцу.Он должен заплатить в общей сложности 538:
2) У клиента Сэмюэля Гэтсби есть 1 входящий вызов и 3 исходящих вызова, однако только trans_id 8 и 11 относятся к июльскому месяцу.Он должен заплатить в общей сложности 722:
Принимая во внимание только эти два примера, вывод будет:
+----+----------------+------------+------------+
| id | name | number | billable |
+----+----------------+------------+------------+
| 2 | American Dad | 7165531212 | 538 |
| 4 | Samuel Gatsby | 9197543321 | 722 |
+----+----------------+------------+------------+
Примечание: Mike Chat не должен быть в спискепоскольку он не звонил и не получал никаких звонков за этот конкретный месяц.
Что я пробовал до сих пор?
Я играл в кошки-мышки с этимво-первых, я использую номер в качестве уникального идентификатора, уже предпринял попытку как полного внешнего соединения, так и объединения, когда входящий или исходящий не равен нулю, затем применял правила к случаю, пытался выполнить левое соединение и применять случаи, но я обхожу круг ине могу попасть в окончательный список.Всякий раз, когда я получаю входящие или исходящие, я либо не могу применить дело, либо не могу прийти вместе с обоими.Очень признателен за помощь!
select customer_name.name, customer_name.number, bill = (CASE
WHEN customer_name.number = transaction_data.incoming then 'sum bill'
else 'multiply and add'
end)
from customer_name
left join transaction_data on customer_name.number = transaction_data.incoming or customer_name.name = transaction_data.outgoing
where strftime('%Y-%m', transaction_data.date_time) = '2018-07'
Примечание: я использую sqlite, чтобы опробовать его в Интернете, но база данных находится на SQL Server 2012, поэтому я знаю, что таким образом я могу гораздо проще использовать формат даты, но я бы хотел быть как можно ближе к T-SQL.
Также попытался создать случай, чтобы определить, является ли он входящим вызовом или исходящим, но в результате я получаю только входящий вызов, хотяtrans_id 10 является исходящим:
select name, number, duration, case
when customer_name.number = transaction_data.incoming then 'incoming'
when customer_name.number = transaction_data.outgoing then 'outgoing'
END direction
from customer_name
left join transaction_data on customer_name.number = transaction_data.incoming or customer_name.name = transaction_data.outgoing
where strftime('%Y-%m', transaction_data.date_time) = '2018-07'