MS SQL-计算字段中单词的出现次数

时间:2019-02-22 06:03:30

标签: sql sql-server database split

我在表中有一列,其中包含如下所示的数据

  • 橘子
  • 苹果
  • 桔子,苹果
  • 芒果

我需要找到水果的出现和名称,并在两列中返回输出

桔子-桔子(2)
苹果-苹果(2)
芒果-芒果(1)

是否可以将LIKE和COUNT函数结合使用以获得期望的结果。

2 个答案:

答案 0 :(得分:3)

sql-server 2016 提供了STRING_SPLIT支持,如果您的版本低于2016,则可以尝试编写一个split函数,以, < / p>

CREATE FUNCTION fn_split ( @stringToSplit VARCHAR(MAX) )
RETURNS
 @returnList TABLE ([Name] [nvarchar] (500))
AS
BEGIN

 DECLARE @name NVARCHAR(255)
 DECLARE @pos INT

 WHILE CHARINDEX(',', @stringToSplit) > 0
 BEGIN
  SELECT @pos  = CHARINDEX(',', @stringToSplit)  
  SELECT @name = SUBSTRING(@stringToSplit, 1, @pos-1)

  INSERT INTO @returnList 
  SELECT @name

  SELECT @stringToSplit = SUBSTRING(@stringToSplit, @pos+1, LEN(@stringToSplit)-@pos)
 END

 INSERT INTO @returnList
 SELECT @stringToSplit

 RETURN
END

然后使用CROSS APPLY通过名称获取count

SELECT Name,count(*)
FROM T t1 CROSS APPLY fn_split(t1.col) v
group by Name

sqlfiddle

答案 1 :(得分:0)

您必须创建与以下相同的功能。

CREATE FUNCTION [dbo].[split](
    @delimited NVARCHAR(MAX),
    @delimiter NVARCHAR(100)
) RETURNS @t TABLE (id INT IDENTITY(1,1), val NVARCHAR(MAX))
AS
BEGIN
    DECLARE @xml XML
    SET @xml = N'<t>' + REPLACE(@delimited,@delimiter,'</t><t>') + '</t>'
    INSERT INTO @t(val)
    SELECT  r.value('.','varchar(MAX)') as item
    FROM  @xml.nodes('/t') as records(r)
    RETURN
END

然后例如。

create table #Fruits (
  id int identity(1,1),
  string nvarchar(100)
)

insert into @Fruits (string) values ('Apple,Mango'), ('Orange'), ('Apple')

select val,val+'(' +cast(count(val) as varchar(10))+')'val
from @Fruits 
  cross apply dbo.split(string,',') 
group by val