Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Запрос про вернувшихся и новых покупателей  [new]
Шкинев А.В.
Member

Откуда:
Сообщений: 29
Есть данные о покупатель - месяц посещения
SELECT [покупатель],
[Месяц]
FROM (
VALUES
(1, 2)
,(1, 3)
,(1, 4)
,(2, 1)
,(2, 2)
,(2, 4)
,(3, 1)
,(3, 2)
,(3, 4)
,(4, 2)
,(4, 3)
,(5, 1)
,(5, 2)
,(6, 3)
,(6, 4)
,(7, 1)
,(7, 3)
,(7, 4)
,(8, 1)
,(8, 3)
) AS t([покупатель], [Месяц])

Нужно получить данные за каждый месяц - сколько всего покупателей, сколько из них вернулось (были в прошлом месяце), сколько новых (не было в прошлом месяце).
1 июн 15, 03:46    [17713643]     Ответить | Цитировать Сообщить модератору
 Re: Запрос про вернувшихся и новых покупателей  [new]
aleks2
Guest
with
data as (
SELECT [покупатель],
[Месяц]
FROM (
VALUES
(1, 2)
,(1, 3)
,(1, 4)
,(2, 1)
,(2, 2)
,(2, 4)
,(3, 1)
,(3, 2)
,(3, 4)
,(4, 2)
,(4, 3)
,(5, 1)
,(5, 2)
,(6, 3)
,(6, 4)
,(7, 1)
,(7, 3)
,(7, 4)
,(8, 1)
,(8, 3)
) AS t([покупатель], [Месяц])
)
,
months as (select distinct [Месяц] from data)
,
-- всего в месяц
total as ( select [Месяц], count(distinct [покупатель]) [Всего] from data group by [Месяц])
,
-- вернулось
ret as ( select [Месяц], count(distinct [покупатель])  [Вернулось]
               from data d1 where exists(select * from data where [Месяц] = d1.[Месяц]-1 and [покупатель] = d1.[покупатель]) 
               group by [Месяц])
,
-- новых
new as ( select [Месяц], count(distinct [покупатель])  [Новых]
               from data d1 where not exists(select * from data where [Месяц] = d1.[Месяц]-1 and [покупатель] = d1.[покупатель]) 
               group by [Месяц])
select m.Месяц, t.Всего, r.Вернулось, n.Новых from 
	months m 
	left outer join total t on m.Месяц = t.Месяц
    left outer join ret r on m.Месяц = r.Месяц
    left outer join new n on m.Месяц = n.Месяц
1 июн 15, 06:03    [17713665]     Ответить | Цитировать Сообщить модератору
 Re: Запрос про вернувшихся и новых покупателей  [new]
Шкинев А.В.
Member

Откуда:
Сообщений: 29
aleks2,
Огромное спасибо за помощь
3 июн 15, 12:59    [17724861]     Ответить | Цитировать Сообщить модератору
 Re: Запрос про вернувшихся и новых покупателей  [new]
Jaffar
Member

Откуда:
Сообщений: 633
aleks2,

что за "много_код"

declare @__TEMP table(IDClient int, Months int)

insert @__TEMP(IDCLient, Months)
SELECT distinct IDClient, Months
FROM (VALUES(1, 2),(1, 3),(1, 4),(2, 1),(2, 2),(2, 4),(3, 1),(3, 2),(3, 4),(4, 2),
		    (4, 3),(5, 1),(5, 2),(6, 3),(6, 4),(7, 1),(7, 3),(7, 4),(8, 1),(8, 3)) AS t(IDClient, Months)

/*
Нужно получить данные за каждый месяц 
- сколько всего покупателей, 
сколько из них вернулось (были в прошлом месяце), 
сколько новых (не было в прошлом месяце). 
*/

--- вот и все решение
select 
t.Months,
sum(1) All_Clients,
IsNULL(sum(case when tp.Months is not NULL then 1 end), 0) IsOld,
IsNULL(sum(case when tp.Months is     NULL then 1 end), 0) IsNew
from @__TEMP t
left join @__TEMP tp on tp.IDClient = t.IDClient and tp.Months = t.Months - 1
group by t.Months
order by t.Months asc
3 июн 15, 13:22    [17725034]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить