我在一个表中有一个列,其中包含如下所示的数据
橘子
苹果
橘子、苹果
芒果
我需要找到发生的事和水果的名称,并在两列中返回输出
橙子-橙子(2)
苹果-苹果(2)
芒果-芒果(1)
是否可以将like和count函数结合起来得到所需的结果。

最佳答案

SQL Server 2016支持STRING_SPLIT如果您的版本低于2016,您可以尝试编写一个split函数,通过,

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

08-20 02:49