Как объединить транзакционные данные с таблицами данных клиента и выполнить операции с учетом регистра в SQL - PullRequest
0 голосов
/ 10 июля 2019

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

Вот мои таблицы:

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

+----+----------------+------------+
| 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:

  • за trans_id 10 = 450 (100 за первые 30 с + 5 * 70 за оставшиеся)

  • для trans_id 13 = 88

2) У клиента Сэмюэля Гэтсби есть 1 входящий вызов и 3 исходящих вызова, однако только trans_id 8 и 11 относятся к июльскому месяцу.Он должен заплатить в общей сложности 722:

  • за trans_id 8 = 345 (100 за первые 30 с + 5 * 49 за оставшиеся)

  • для trans_id 11 = 377

Принимая во внимание только эти два примера, вывод будет:

+----+----------------+------------+------------+
| 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'

1 Ответ

1 голос
/ 10 июля 2019

Попробуйте это:

SELECT
  c."name", c.number,
  SUM(CASE c.number
        WHEN t.incoming THEN t.duration
        ELSE IIF(t.duration - 30 < 0, 0, t.duration - 30) * 5 + 100
      END) AS billable
FROM Customer AS c INNER JOIN [Transaction] AS t
  ON c.number IN(t.incoming, t.outgoing)
WHERE t.date_time >= '20180701' AND t.date_time < '20180801'
GROUP BY c."name", c.number

Выход:

|     name      |   number   | billable |
+---------------+------------+----------+
| John Doe      | 8973221232 |      440 |
| American Dad  | 7165531212 |      538 |
| Michael Clean | 8884731234 |      774 |
| Samuel Gatsby | 9197543321 |      722 |

Протестируйте его онлайн с SQL Fiddle .

...