Посчитайте, сколько раз слово существует в столбце - PullRequest
0 голосов
/ 15 января 2020

У меня есть таблица 1:

CREATE TABLE table1
INSERT INTO table1 values('XYZ')
INSERT INTO table1 values('ABC')
INSERT INTO table1 values('XYZ~ABC~AAA')
INSERT INTO table1 values('123')

Затем у меня есть строка 'ABC ~ XYZ ~ 123'. Мне нужно разбить эту строку на каждое слово, используя SQL:

Select VALUE FROM STRING_SPLIT('ABC~XYZ~123','~')

Возвращаемое значение table2

ABC
XYZ
123

Я хочу подсчитать, сколько раз каждое слово в таблице2 существовало в Таблица 1

Ожидаемый результат -

ABC|3
XYZ|2
123|1

Есть идеи по этому поводу?

Ответы [ 3 ]

1 голос
/ 15 января 2020

Если я правильно понимаю ваш случай, может помочь следующее утверждение:

Текст и таблица:

DECLARE @text varchar(100) = 'ABC~XYZ~123'
CREATE TABLE Data (
   Id int,
   [Text] varchar(100)
)
INSERT INTO Data
   (Id, [Text])
VALUES
   (1, 'XYZ'),
   (2, 'ABC'),
   (3, 'XYZ~ABC~AAA'),
   (4, '123~ABC')

Заявление:

SELECT t.[value] AS [Word], j.[Count]
FROM STRING_SPLIT(@text, '~') t
LEFT JOIN (
   SELECT s.[value], COUNT(*) AS [Count]
   FROM Data d
   CROSS APPLY STRING_SPLIT(d.[Text], '~') s
   GROUP BY s.[value]
) j ON t.[value] = j.[value]

Результат:

-----------
Word  Count
-----------
ABC   3
XYZ   2
123   1
0 голосов
/ 15 января 2020

Настройка

create table STRINGS (ID int, STRINGS varchar(max));

insert into STRINGS (ID, STRINGS) values (1, 'XYZ');
insert into STRINGS (ID, STRINGS) values (1, 'ABC');
insert into STRINGS (ID, STRINGS) values (1, 'XYZ~ABC~AAA');
insert into STRINGS (ID, STRINGS) values (1, '123~ABC');

declare @VALUES varchar(max) = 'XYZ~ABC~123';

Расчет:

select V1.VALUE, count(STRINGS.ID) 
from string_split(@VALUES,'~') V1
     cross join STRINGS
     outer apply string_split(STRINGS.STRINGS,'~') V2
where V2.VALUE = V1.VALUE     
group by V1.VALUE     

Результат

-----------
Value Num
-----------
ABC   3
XYZ   2
123   1

Живой пример: https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=15b95efcf69ea98fafbb7dda1c624551

0 голосов
/ 15 января 2020

Помимо предложений, как в комментарии, вы можете использовать функцию Count () , как показано ниже. Но хранение в этом формате создаст трудности для извлечения, а также для объединения с другими таблицами.

Select T1Value, Count(*) as [NoCount] from(
 Select table1.Value as T1Value, Value FROM STRING_SPLIT('ABC~XYZ~123','~')
 inner join table1 on Value = table1.Value
)a group by T1Value

Правка

CREATE TABLE table1(
  TableValue varchar(max)
);

INSERT INTO table1 (TableValue) values ( 'XYZ');
INSERT INTO table1 ( TableValue) values ( 'ABC');
INSERT INTO table1 ( TableValue) values ( 'XYZ~ABC~AAA');
INSERT INTO table1 ( TableValue) values ( '123~ABC');

SELECT b.value
    ,Count(*)
FROM (
    SELECT VALUE
    FROM STRING_SPLIT('ABC~XYZ~123', '~')
    ) a
INNER JOIN (
    SELECT *
    FROM table1
    CROSS APPLY STRING_SPLIT(TableValue, '~')
    ) b ON a.Value = b.Value
GROUP BY b.Value

Вот дано Живая демоверсия на дб <> скрипка

...