【问题标题】:How do you count and list number of occurrences of a phrase or word separated by a semicolon in a string in SQL?如何计算和列出 SQL 字符串中以分号分隔的短语或单词的出现次数?
【发布时间】:2020-09-17 15:28:32
【问题描述】:

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

"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"

【问题讨论】:

  • 拆分成行(如何完成取决于您的 DBMS),GROUP BY 最后应用 listagg(同样,如何完成取决于您的 DBMS)

标签: sql sql-server sql-server-2016


【解决方案1】:

这应该适合你

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,1,''), len(@string)-1,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('')
                )
            , 1, 2, '')
        , '"')

select @result

【讨论】:

    【解决方案2】:

    在 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,' ',v),';') within group (order by c desc)
    from  (
        select count(*) as c, trim(value) v
        from string_split(@text,';')
        group by trim(value)
    ) x;
    

    【讨论】:

    • 由于某种原因,SQL Server 2016 不允许使用函数字符串聚合和“修剪”。有谁知道为什么会抛出这些错误?
    • TRIM 从 2017 版开始工作,请参阅链接了解如何在早期版本中进行操作。 STRING_AGG 也是如此,如果您搜索,您会找到适用于早期版本的 MS SQL 的解决方案。
    • STRING_AGG 用于早期版本。 (为什么一按回车键就找到链接了....)
    猜你喜欢
    • 2019-09-17
    • 1970-01-01
    • 2015-07-19
    • 2020-09-28
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    相关资源
    最近更新 更多