您需要拆分值,然后执行计数。如果您没有拆分功能,并且您的 SQL Server 版本中没有内置这样的功能,请检查此CLR 集成。
否则,这里是纯 T-SQL 解决方案:
DECLARE @DataSource TABLE
(
[TicketID] INT
,[Resources] VARCHAR(MAX)
);
INSERT INTO @DataSource ([TicketID], [Resources])
VALUES (1234, 'Name1, Name2, Name3, NameN')
,(1238, 'Name2, Name3 ')
,(1240, 'Name4, Name5');
WITH DataSource ([TicketID], [Resources]) AS
(
SELECT [TicketID]
,CAST(N'<r><![CDATA[' + REPLACE([Resources], ',', ']]></r><r><![CDATA[') + ']]></r>' AS XML)
FROM @DataSource
), DataSourceNormalized ([Resource], [TicketID]) AS
(
SELECT RTRIM(LTRIM(Tbl.Col.value('.', 'varchar(250)')))
,[TicketID]
FROM DataSource
CROSS APPLY [Resources].nodes('//r') Tbl(Col)
)
SELECT [Resource]
,COUNT([TicketID]) AS [Count]
FROM DataSourceNormalized
GROUP BY [Resource];
第一个 CTE 将值转换为 XML,以便能够拆分它们。第二个规范化数据:
然后,简单地进行聚合:
如果您处理大量数据,这可能会很慢。如果您正在寻找性能,您需要实现 CLR 拆分功能,甚至更好地规范化您的数据,以便做好准备COUNT
。