Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Вопрос по select  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по select  [new]
Michail A.
Member

Откуда:
Сообщений: 96
Up
2 ноя 18, 16:39    [21722670]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по select  [new]
court
Member

Откуда:
Сообщений: 2015
Michail A.
Добрый день, коллеги.

Есть таблица со следующими полями:
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


// Нормальное ли решение

исх.задачу запрос решает

но, имхо, можно сделать лучше
;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]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по select  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по select  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по select  [new]
Michail A.
Member

Откуда:
Сообщений: 96
Michail A.,

Up
3 ноя 18, 18:34    [21723348]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по select  [new]
Michail A.
Member

Откуда:
Сообщений: 96
Michail A.,

Up
5 ноя 18, 20:55    [21724570]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по select  [new]
Cristiano_Rivaldo
Member

Откуда:
Сообщений: 327
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]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по select  [new]
invm
Member

Откуда: Москва
Сообщений: 9345
Michail A.
Или скорее даже так?
Кто же знает, кроме вас?
Если результирующие значение 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 Ответить