powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вопрос по select
9 сообщений из 9, страница 1 из 1
Вопрос по select
    #39726926
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
...
Рейтинг: 0 / 0
Вопрос по select
    #39727318
Michail A.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Up
...
Рейтинг: 0 / 0
Вопрос по select
    #39727324
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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. Нормальное ли решение или что-то не учитываю?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
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



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

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

но, имхо, можно сделать лучше
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
;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
...
Рейтинг: 0 / 0
Вопрос по select
    #39727461
Michail A.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
court,

Спасибо за подсказку.

А если есть та же таблица со следующими полями:
ClientId, Report_date, vsp_number (номер офиса),
txn_type которое принимает значение debit или credit, txn_amount - сумма операции.

Но теперь нужно написать запрос (в виде Client_id, Report_date, Ratio), который для каждого клиента выведет долю debit операций клиента к debit операциям всех клиентов по месяцам.

Таким образом верно будет?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
; 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
...
Рейтинг: 0 / 0
Вопрос по select
    #39727469
Michail A.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Или скорее даже так?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
; 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 
...
Рейтинг: 0 / 0
Вопрос по select
    #39727640
Michail A.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Michail A.,

Up
...
Рейтинг: 0 / 0
Вопрос по select
    #39728236
Michail A.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Michail A.,

Up
...
Рейтинг: 0 / 0
Вопрос по select
    #39728370
Cristiano_Rivaldo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
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
...
Рейтинг: 0 / 0
Вопрос по select
    #39728389
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Michail A.Или скорее даже так?Кто же знает, кроме вас?
Если результирующие значение report_date зависит от txn_type, то можно упростить
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
; 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 
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вопрос по select
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]