【问题标题】:SQL: Count of items in comma-separated column in a tableSQL:表中以逗号分隔的列中的项目计数
【发布时间】:2019-12-09 06:48:08
【问题描述】:
Column1
--------
1,2,4
2,3,5
2,1,3

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

No   Count
----------
1     2
2     3
3     2
4     1

当我尝试使用

SELECT SUM(LEN(Holidays) - LEN(REPLACE(Holidays, ',', '')) + 1)  
FROM [dbo].[OhLog]

我没有按项目计数。相反,它正在获得完整的计数。

【问题讨论】:

  • Sql Server 2017

标签: sql sql-server split


【解决方案1】:

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

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

输出:

Holiday     Count
1           2
2           3
3           2
4           1
5           1

Demo on dbfiddle

如果您的数据库兼容版本低于 130,您将无法访问 STRING_SPLIT。您可以按照manual 中的说明修改兼容性版本,或者使用此查询(基于this answer):

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]

输出与之前的查询相同。 Demo on dbfiddle

【讨论】:

  • 它显示这条消息'无效的对象名称'STRING_SPLIT''
  • @LimnaD'silva 你的数据库兼容级别是多少?至少需要 130 才能使用STRING_SPLIT。如果低于这个值,你可以调整它吗?请参阅manual。如果你运行的是 SQL Server 2017,它应该是 140...
  • @LimnaD'silva 查看我的编辑,我添加了一个适用于较低兼容性版本数据库的解决方案。
【解决方案2】:

请尝试:

SELECT 
    Num, count(*) Cnt from
(
    SELECT 
    LTRIM(RTRIM(m.n.value('.[1]','varchar(8000)'))) AS Num
    FROM
    (
    SELECT CAST('<XMLRoot><RowData>' + REPLACE(Column1,',','</RowData><RowData>') + '</RowData></XMLRoot>' AS XML) AS x
    FROM   tbl
    )t
    CROSS APPLY x.nodes('/XMLRoot/RowData')m(n)
)x
GROUP BY Num

Demo Result

【讨论】:

    【解决方案3】:

    因此,您可以使用 STRING_SPLIT 函数。它受 Sql Server 2017 支持。 更多信息在这里http://www.sqlservertutorial.net/sql-server-string-functions/sql-server-string_split-function/

    它从字符串创建一个表。

    因此,对于 DB 中的每一行,您将获得一个表。要将其合并到一个公用表中,您必须使用 CROSS APPLY。

    SELECT VALUE, COUNT(*) FROM test_for_parse CROSS APPLY STRING_SPLIT(array_value,',') GROUP BY VALUE
    

    所以,这是一个模拟您的情况的代码示例。

    https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=8393f8dab667b528ed5aad7c61da74fe

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-19
      • 2018-08-07
      • 1970-01-01
      • 2021-12-31
      • 1970-01-01
      • 2012-06-03
      • 1970-01-01
      相关资源
      最近更新 更多