SQL:表中逗号分隔列中的项目数

Lim*_*lva 1 sql sql-server split

Column1
--------
1,2,4
2,3,5
2,1,3
Run Code Online (Sandbox Code Playgroud)

我在表中有一个列,如上所示以逗号分隔。我需要从中获得以下输出:

No   Count
----------
1     2
2     3
3     2
4     1
Run Code Online (Sandbox Code Playgroud)

当我尝试

SELECT SUM(LEN(Holidays) - LEN(REPLACE(Holidays, ',', '')) + 1)  
FROM [dbo].[OhLog]
Run Code Online (Sandbox Code Playgroud)

我没有得到明智的项目计数。相反,它正在得到充分计数。

Nic*_*ick 6

您可以使用CROSS_APPLYwithSTRING_SPLIT从逗号分隔的数据值创建行,然后COUNT是每个值的出现次数:

SELECT value as [Holiday], COUNT(*) AS [Count]
FROM OhLog
CROSS APPLY STRING_SPLIT([Holidays], ',')
GROUP BY value
Run Code Online (Sandbox Code Playgroud)

输出:

Holiday     Count
1           2
2           3
3           2
4           1
5           1
Run Code Online (Sandbox Code Playgroud)

dbfiddle 上的演示

如果您的数据库兼容版本不是至少 130,您将无法访问STRING_SPLIT. 您可以按照手册中的说明修改兼容性版本,或者使用此查询(基于此答案):

SELECT [Holiday], COUNT(*) AS [Count]
FROM (SELECT Split.a.value('.', 'NVARCHAR(MAX)') [Holiday]
      FROM (SELECT CAST('<X>'+REPLACE([Holidays], ',', '</X><X>')+'</X>' AS XML) AS String
            FROM Ohlog
     ) AS A
     CROSS APPLY String.nodes('/X') AS Split(a)) AS O
GROUP BY [Holiday]
Run Code Online (Sandbox Code Playgroud)

输出与先前查询相同。dbfiddle 上的演示