Вам нужно разделить значения, а затем выполнить подсчет. Если у вас нет функции разделения и ее нет в вашей версии SQL Server Edition, проверьте это Интеграция со средой 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
.
person
gotqn
schedule
08.08.2018