У меня есть таблица 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= до первой следующей точки с запятой? Как только у меня будет это, я думаю, что простая группа по добьется цели

0
Henrov 16 Апр 2020 в 19:42

2 ответа

Лучший ответ

Ммм , , Вы можете использовать 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;

Вот скрипка db <>.

Или используя 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, '');
2
Gordon Linoff 16 Апр 2020 в 16:51

Вы можете использовать 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));
0
Yogesh Sharma 16 Апр 2020 в 16:51