Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Michail A. Member Откуда: Сообщений: 96 |
Добрый день, коллеги. Есть таблица со следующими полями: ClientId, Report_date, vsp_number (номер офиса), txn_type которое принимает значение debit или credit, txn_amount - сумма операции. Нужно для каждого клиента (client_id) вывести сумму debit, credit операций и последний посещенный офис vsp_number помесячно. Формат вывода - client_id, report_date, debit_amount, credit_amount, Last_VSP Текст запроса ниже, собственно сомнение у меня по поводу привязки последнего посещенного VSP. Нормальное ли решение или что-то не учитываю? select t.Client_id, t.Report_date,t.Debit_amount,t.Credit_amount,t1.Last_VSP from ( SELECT client_id, max(report_date) as Report_date, sum (case when txn_type like 'debit' then txn_amount else 0 end) as Debit_amount, sum (case when txn_type like 'credit' then txn_amount else 0 end) as Credit_amount FROM [dbo].[VSP_oper_data] group by client_id, year(report_date),month(report_date) ) t cross apply ( SELECT top 1 vsp_number as Last_VSP FROM [dbo].[VSP_oper_data] where client_id = t.client_id and report_date = t.report_date order by report_date desc ) t1 |
2 ноя 18, 08:03 [21722091] Ответить | Цитировать Сообщить модератору |
Michail A. Member Откуда: Сообщений: 96 |
Up |
2 ноя 18, 16:39 [21722670] Ответить | Цитировать Сообщить модератору |
court Member Откуда: Сообщений: 2243 |
// Нормальное ли решение исх.задачу запрос решает но, имхо, можно сделать лучше ;with cte as ( SELECT client_id, vsp_number, report_date, sum (case when txn_type like 'debit' then txn_amount else 0 end)over(partition by client_id, year(report_date),month(report_date)) as Debit_amount, sum (case when txn_type like 'credit' then txn_amount else 0 end)over(partition by client_id, year(report_date),month(report_date)) as Credit_amount ,rn =row_number()over(partition by client_id, year(report_date),month(report_date) order by report_date desc) FROM [dbo].[VSP_oper_data] ) select * from cte where rn=1 |
||
2 ноя 18, 16:52 [21722679] Ответить | Цитировать Сообщить модератору |
Michail A. Member Откуда: Сообщений: 96 |
court, Спасибо за подсказку. А если есть та же таблица со следующими полями: ClientId, Report_date, vsp_number (номер офиса), txn_type которое принимает значение debit или credit, txn_amount - сумма операции. Но теперь нужно написать запрос (в виде Client_id, Report_date, Ratio), который для каждого клиента выведет долю debit операций клиента к debit операциям всех клиентов по месяцам. Таким образом верно будет? ; WITH CTE AS ( Select client_id, report_date, sum (case when txn_type like 'debit' then 1.0 else 0 end) over (partition by client_id, year(report_date), month(report_date)) / sum (case when txn_type like 'debit' then 1.0 else 0 end) over() as ratio, rn = row_number () over (partition by client_id, year(report_date), month(report_date) order by report_date desc) from dbo.VSP_oper_data ) Select client_id, report_date, ratio from cte where rn = 1 and ratio != 0 |
2 ноя 18, 23:08 [21723059] Ответить | Цитировать Сообщить модератору |
Michail A. Member Откуда: Сообщений: 96 |
Или скорее даже так?; WITH CTE AS ( Select client_id, report_date, sum (case when txn_type like 'debit' then 1.0 end) over (partition by client_id, year(report_date), month(report_date)) / sum (case when txn_type like 'debit' then 1.0 end) over(partition by year(report_date), month(report_date)) as ratio, rn = row_number () over (partition by client_id, year(report_date), month(report_date) order by report_date desc) from dbo.VSP_oper_data ) Select client_id, report_date, ratio from cte where rn = 1 and ratio !=0 |
2 ноя 18, 23:23 [21723071] Ответить | Цитировать Сообщить модератору |
Michail A. Member Откуда: Сообщений: 96 |
Michail A., Up |
3 ноя 18, 18:34 [21723348] Ответить | Цитировать Сообщить модератору |
Michail A. Member Откуда: Сообщений: 96 |
Michail A., Up |
5 ноя 18, 20:55 [21724570] Ответить | Цитировать Сообщить модератору |
Cristiano_Rivaldo Member Откуда: Сообщений: 346 |
Select distinct client_id, max(report_date) over (partition by client_id, year(report_date), month(report_date)) as report_date, sum (case when txn_type like 'debit' then 1.0 end) over (partition by client_id, year(report_date), month(report_date)), sum (case when txn_type like 'debit' then 1.0 end) over(partition by year(report_date), month(report_date)) as ratio, first_value(vsp_number) over (partition by client_id, year(report_date), month(report_date) order by report_date desc) from dbo.VSP_oper_data |
6 ноя 18, 09:39 [21724876] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9634 |
Если результирующие значение report_date зависит от txn_type, то можно упростить ; WITH CTE AS ( Select client_id, report_date, cast(count(*) over (partition by client_id, year(report_date), month(report_date)) as float) / count(*) over(partition by year(report_date), month(report_date)) as ratio, rn = row_number () over (partition by client_id, year(report_date), month(report_date) order by report_date desc) from dbo.VSP_oper_data where txn_type = 'debit' ) Select client_id, report_date, ratio from cte where rn = 1 and ratio !=0 |
||
6 ноя 18, 10:22 [21724920] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |