Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
kombala Member Откуда: Сообщений: 41 |
Есть таблица с внутренними кодами услуг, с общими кодами и промежуточная таблица. Проблема в том, что в промежуточной таблице по какой-то причине коды услуг внесены в одну строку через запятую, и чтобы подсчитать коэффициент стоимости необходимо сложить модификаторы услуг на каждую процедуру. Грубо говоря, у меня сейчас в промежуточной таблице так данные хранятся: id | cdusl | cdaction 1 | 1 | 1 2 | 1,2,3,4 | 2 3 | 3,4 | 3 |
29 июн 17, 14:37 [20599690] Ответить | Цитировать Сообщить модератору |
kombala Member Откуда: Сообщений: 41 |
А редактировать нельзя случайно отправленные? Чтобы нормально связать эти коды, нужно разбить значения из второго столбца на несколько строк, как-то так: 1 | 1 | 1 2 | 1 | 2 2 | 2 | 2 2 | 3 | 2 2 | 4 | 2 3 | 3 | 3 3 | 4 | 3 Подскажите пожалуйста. |
29 июн 17, 14:39 [20599694] Ответить | Цитировать Сообщить модератору |
Ролг Хупин Member Откуда: Чебаркуль Сообщений: 4072 |
Функция, возвращающая таблицу? |
29 июн 17, 15:06 [20599800] Ответить | Цитировать Сообщить модератору |
_human Member Откуда: Сообщений: 566 |
;with cte(id,cdusl,cdaction) as ( select 1 , '1', 1 union all select 2 , '1,2,3,4', 2 union all select 3 , '3,4', 3 ) , src as ( select id, replace(cdusl, ',', '.') as cdusl, cdaction from cte ) select * from src s cross apply ( select top 4 parsename(s.cdusl, row_number() over(order by newid())) as x from master..spt_values v ) as ca where ca.x is not null order by s.id, x |
||
29 июн 17, 15:40 [20599963] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47063 |
Функция, которая делит строку на слова Ну, и тут неоднократно писали, как это же сделать с помощью XML... |
29 июн 17, 16:34 [20600217] Ответить | Цитировать Сообщить модератору |
kombala Member Откуда: Сообщений: 41 |
_human, Спасибо большое. |
29 июн 17, 16:55 [20600302] Ответить | Цитировать Сообщить модератору |
kombala Member Откуда: Сообщений: 41 |
_human, Я дурак, можете подсказать, что делать, если значений там больше 4х? Т.е. вот делаю: ;with cte(id,cdusl,cdaction) as ( select 2 , '1,0,1,4', 2 ) , src as ( select id, replace(cdusl, ',', '.') as cdusl, cdaction from cte ) select * from src s cross apply ( select parsename(s.cdusl, row_number() over(order by newid())) as x from master..spt_values v ) as ca where ca.x is not null order by s.id, x И мне красиво выводится
А добавляю n значений, после четвертого: select 2 , '1,0,1,4,10,12,55', 2 и в столбце 'x' только null'ы ставятся. |
|||||||||||||||||||||
30 июн 17, 13:35 [20602763] Ответить | Цитировать Сообщить модератору |
_human Member Откуда: Сообщений: 566 |
kombala, Если сервер 2016-й то используйте STRING_SPLIT Или найдите на форуме уже готовую функцию для парсирга |
30 июн 17, 15:14 [20603275] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47063 |
- Доктор, меня никто не замечает! © ![]() |
||
30 июн 17, 18:10 [20604063] Ответить | Цитировать Сообщить модератору |
kombala Member Откуда: Сообщений: 41 |
_human, iap, Большое спасибо, теперь заработало как надо. |
3 июл 17, 09:50 [20608017] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |