Группировка по части строки - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть таблица LOG, которая содержит поле NOTES. Таблица LOG также содержит поле NrofItems. Это на Azure SQL. NOTES - это строка, содержащая пары значений ключа, разделенные точкой с запятой. Порядок пар ключ-значение является случайным.

Пример трех записей:

NOTES | NrofItems    
"customer=customer1;code=blablabla;application=SomeApplication"  | 23
"code=blablabla;customer=customer99;application=AlsoApplication" | 33
"code=blablabla;customer=customer1;application=AlsoApplication"  |  2

Мне нужно суммировать значение NrofItems для каждого клиента следующим образом:

customer1  | 25
customer99 | 33

Как мне разбить строку, чтобы получить часть после customer= до первой следующей точки с запятой? Как только я получу это, я думаю, что простая группа сделает трюк

Ответы [ 2 ]

3 голосов
/ 16 апреля 2020

Хммм. , , Вы можете использовать string_split(), дважды:

select s2.value, sum(nrofitems)
from t cross apply
     string_split(t.notes, ';') s1 cross apply
     string_split(s1.value, '=') s2
where s1.value like 'customer=%' and s2.value <> 'customer'
group by s2.value;

Здесь - это дБ <> скрипка.

Или использование string_split() один раз:

select stuff(s1.value, 1, 10, ''), sum(nrofitems)
from t cross apply
     string_split(t.notes, ';') s1 
where s1.value like 'customer=%' 
group by stuff(s1.value, 1, 10, '');
0 голосов
/ 16 апреля 2020

Вы можете использовать substring()

select left(tt.notes, charindex(';', tt.notes)), sum(t.nroftimes)
from table t cross apply
     ( values (substring(notes, charindex('customer=', notes)+9, len(notes))) 
     ) tt(notes)
group by left(tt.notes, charindex(';', tt.notes));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...