在SQL中,如何计算和列出用分号分隔的短语或单词的出现次数?

问题描述

我有一列的值的格式如引号所示。

"Promotion - External; Outside Hire; Reassignment - External; Promotion - External; Promotion - External; Promotion - External; Promotion - External; Outside Hire; Promotion - External"

如何使用Ssql Server 2016设置格式使其显示为引号中的结果?

"6 Promotion - External; 2 Outside Hire; 1 Reassignment - External"

解决方法

这应该为您工作

declare @string as varchar(1000),@result varchar(500)

set @string = '"Promotion - External; Outside Hire; Reassignment - External; Promotion - External; Promotion - External; Promotion - External; Promotion - External; Outside Hire; Promotion - External"'
set @string = stuff(stuff(@string,1,''),len(@string)-1,'')

;with data as
(
    select rtrim(ltrim(i.value('.','varchar(max)'))) string
    from 
    (
        select cast('<M>' + replace(@string,';','</M><M>') + '</M>' as xml) as info
    ) as d
    cross apply d.info.nodes ('/M') AS Split(i)
),final_result as
(
    select string,count(string) num
    from data
    group by string
)
select @result = 
concat('"',stuff(
                (
                    select concat('; ',cast(num as varchar),' ',string) 
                    from final_result 
                    order by num desc
                    for xml path('')
                ),2,'"')

select @result
,

在MS SQL中:

DECLARE @text varchar(max) = 'Promotion - External; Outside Hire; Reassignment - External; Promotion - External; Promotion - External; Promotion - External; Promotion - External; Outside Hire; Promotion - External';

select string_agg(concat(c,v),';') 
from  (
    select count(*) as c,trim(value) v
    from string_split(@text,';')
    group by trim(value)
) x;

输出:

2 Outside Hire;6 Promotion - External;1 Reassignment - External

或者,如果您希望输出顺序相同,例如:

6 Promotion - External;2 Outside Hire;1 Reassignment - External

然后您可以尝试:

select string_agg(concat(c,';') within group (order by c desc)
from  (
    select count(*) as c,';')
    group by trim(value)
) x;