问题描述
我有一列的值的格式如引号所示。
"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;