Как создать список имен клиентов, которые превысили количество транзакций в день и лимит транзакций - PullRequest
0 голосов
/ 21 сентября 2019

таблица 1

'name'              'amount'           'day'
---------------------------------------------
hemanth        10000      2019-06-21
hemanth        1000       2019-06-21
hemanth        5000       2019-06-21
hemanth        10000      2019-07-21    
kumar          100        2019-06-21
kumar          5000       2019-06-21
kumar          1000      2019-07-21
kiranmai       10000     2019-06-21
kiranmai       500      2019-07-21
kiranmai       10000     2019-06-21

таблица 2 содержит лимит перевода в день и лимит суммы перевода

tranlimperday                transamontlim
--------------------------------------------
3                      10000

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

ожидаем, что результат будет

Name
---------
Hemanth
kiranmai

Ответы [ 2 ]

0 голосов
/ 21 сентября 2019

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

SELECT name,Day,
COUNT(1) num_tran,
SUM(amount) tran_amt 
FROM Table1
CROSS JOIN Table2 
GROUP BY name,Day,YEAR(day),MONTH(Day),DAY(Day)
HAVING COUNT(1) >= MAX(Table2.tranlimperday) -- Considering Single row in the table2
OR SUM(amount)  > MAX(Table2.transamontlim) -- Considering Single row in the table2
0 голосов
/ 21 сентября 2019

Я бы предложил два отдельных запроса и union:

select name
from (select name, day,
             sum(amount) as total_amount, count(*) as cnt
      from table1
      group by name, day
     ) nd join
     table2 t2
     on t1.cnt >= t2.tranlimperday
union  -- on purpose to remove duplicates
select name
from (select name, year(day) as yyyy, month(day) as mm,
             sum(amount) as total_amount, count(*) as cnt
      from table1
      group by name, year(day), month(day)
     ) nym join
     table2 t2
     on t1.total_amount >= t2.transamontlim;

В MySQL 8+ вы также можете использовать оконные функции:

select distinct name
from (select name, day,
             sum(amount) as daily_total_amount, count(*) as daily_cnt,
             sum(sum(amount)) over (partition by name, year(day), month(day)) as monthly_total_amount,                  
             sum(count(*)) over (partition by name, year(day), month(day)) as monthly_cnt 
      from table1
      group by name, day
     ) nd join
     table2 t2
     on t1.daily_cnt >= t2.tranlimperday or
        t1.monthly_total_amount >= t2.transamontlim;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...