我在表中有一列,其中包含如下所示的数据
我需要找到水果的出现和名称,并在两列中返回输出
桔子-桔子(2)
苹果-苹果(2)
芒果-芒果(1)
是否可以将LIKE和COUNT函数结合使用以获得期望的结果。
答案 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
答案 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