Я создал запрос, который показывает, сколько раз отдельный клиент появляется в списке транзакций ....

select Client_Ref, count(*)
from Transactions
where Start_Date >= '2015-01-01'
group by Client_Ref
order by Client_Ref

... это возвращает такие данные ...

Client1   1
Client2   4
Client3   1
Client4   3

Что мне нужно сделать, так это разбить это на диапазоны частот, чтобы я получил что-то вроде этого ...

No. of Clients with 1 transaction   53
No. of Clients with 2 transaction   157
No. of Clients with 3 transaction   25
No. of Clients with >3 transactions 259

Я не могу придумать, как это сделать в SQL, возможно, я мог бы понять это в Excel, но я бы предпочел, чтобы это было сделано на уровне сервера.

0
dazzathedrummer 16 Окт 2015 в 17:15

5 ответов

Лучший ответ

Я называю это запросом «гистограмма гистограммы». Просто используйте group by дважды:

select cnt, count(*), min(CLlient_Ref), max(Client_Ref)
from (select Client_Ref, count(*) as cnt
      from Transactions
      where Start_Date >= '2015-01-01'
      group by Client_Ref
     ) t
group by cnt
order by cnt;

Я включаю минимальную и максимальную клиентскую ссылку, потому что мне часто хочется дополнительно исследовать определенные значения.

Если вы хотите установить ограничение на 3, вы можете использовать case:

select (case when cnt <= 3 then cast(cnt as varchar(255)) else '4+' end) as grp,
       count(*), min(CLlient_Ref), max(Client_Ref)
from (select Client_Ref, count(*) as cnt
      from Transactions
      where Start_Date >= '2015-01-01'
      group by Client_Ref
     ) t
group by (case when cnt <= 3 then cast(cnt as varchar(255)) else '4+' end) 
order by min(cnt);
2
Gordon Linoff 16 Окт 2015 в 14:24
select Client_Ref
    ,count(*) as Count
    ,case when count(*) < 4 then count(*) else 4 end as Band
from Transactions
where Start_Date >= '2015-01-01'
group by Client_Ref
order by Client_Ref 
0
D'Arcy Rittich 16 Окт 2015 в 14:29

Вы можете создать сегменты отдельно, а затем использовать union all:

with COUNT1 as (
select Client_Ref, count(*) as count1
from Transactions
where Start_Date >= '2015-01-01'
group by Client_Ref
order by Client_Ref
    )
,COUNT2 as (
select cast(C.count1 as varchar(5)) as count1,count(Client_Ref) as count2
from COUNT1 C
where count1 <= 3
group by C.count1
    )
,COUNT3 as (
select '> 3' as count1,count(*) as count2
from COUNT1 C
where C.count1 > 3
    )

select * from COUNT2
union all
select * from COUNT3

Вы можете ввести этот текст вручную («Количество клиентов с N транзакциями»), если хотите.

0
Sam cd 16 Окт 2015 в 14:26

Вы можете выполнить условное SUM(), чтобы получить итоговую сумму для каждой группы:

Select  'No. of Clients with 1 transaction' = Sum(Case When A.Total = 1 Then 1 Else 0 End),
        'No. of Clients with 2 transactions' = Sum(Case When A.Total = 2 Then 1 Else 0 End),
        'No. of Clients with 3 transactions' = Sum(Case When A.Total = 3 Then 1 Else 0 End),
        'No. of Clients with >3 transactions' = Sum(Case When A.Total > 3 Then 1 Else 0 End)
From    
(
    Select  Client_Ref, count(*) As Total
    From    Transactions
    Where   Start_Date >= '2015-01-01'
    Group by Client_Ref
) A
0
Siyual 16 Окт 2015 в 14:25
select cnt, count(*) from
(
select case count(*) when 1 then 'No. of Clients with 1 transaction'
                     when 2 then 'No. of Clients with 2 transactions'
                     when 3 then 'No. of Clients with 3 transactions'
                            else 'No. of Clients with >3 transactions'
       end as cnt
from Transactions
where Start_Date >= '2015-01-01'
group by Client_Ref
)
group by cnt
0
jarlh 16 Окт 2015 в 14:25