сгруппировать и посчитать результат от LEN и псевдонима - PullRequest
1 голос
/ 04 ноября 2019

У меня есть столбец с данными, как показано ниже.

A1
A2
A3
A1/B1
A1/B2
A1/B1/C1

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

Которые данные не имеют / есть3, имеет один / равен 2, имеет два / равен 1

select ( len(colA) - len(replace(colA, '/', '')) ) as num_slashes 
from DBO.table1  

результат, возвращаемый, как показано ниже, как считать 0 имеет 3 счета, 1 имеет 2 счета, 2 имеет 1 счет?

0
0
0
1
1
2

Ответы [ 3 ]

1 голос
/ 04 ноября 2019

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

select 
 num_slashes
 count(*) as count_appearances
from (
  select 
    len(colA) - len(replace(colA, '/', '')) as num_slashes
  from DBO.table1
) t
group by num_slashes

Если вам нужна дополнительная сортировка на основе количествакосые черты, затем добавьте order by num_slashes в конце запроса.

1 голос
/ 04 ноября 2019

Вы можете повторить выражение в select и group by;

select ( len(colA) - len(replace(colA, '/', '')) ) as num_slashes,
       count(*) 
from DBO.table1 
group by ( len(colA) - len(replace(colA, '/', '')) )

Некоторые базы данных позволяют использовать псевдонимы для group by, в этом случае:

select ( len(colA) - len(replace(colA, '/', '')) ) as num_slashes,
       count(*) 
from DBO.table1 
group by num_slashes;
1 голос
/ 04 ноября 2019

вы можете использовать count distinct для этого требования. Я использую subquery, чтобы не повторять len(colA) - len(replace(colA, '/', ''))

select count(distinct case when t1.num_slashes < 1 then 0 else num_slashes end) as num_slashes
from (select 
     (len(colA) - len(replace(colA, '/', ''))) as num_slashes 
    from DBO.table1) t1
...