|
Запрос разделить строку на несколько строк | ☑ | ||
|---|---|---|---|---|
|
0
Dimon1C
20.03.26
✎
08:47
|
Добрый день.
Есть таблица: Сумма Количество Номера (через запятую строкой) 500 руб 5 штук 2,3,7 600 руб 2 штук 1,7 100 руб 4 штук 1,7,9,3 Нужно запросом разбить строки по номерам, и пропорционально разбить сумму. То есть в каждой строке будет один номер с нужной суммой. Подскажите, запрос реально такой сделать? или проще кодом СтрРазделить и т.д. |
|||
|
1
Fish
гуру
20.03.26
✎
08:48
|
А количество не надо разбивать?
|
|||
|
2
Климов Сергей
20.03.26
✎
09:05
|
ИМХО, делать такое запросом - изврат.
|
|||
|
3
PLUT
гуру
20.03.26
✎
09:09
|
(0) купить у mmg суперобормотку для подключения к ИИ, занести денежек на подпиську к этому самому ИИ и он вам всё сделает - и табличку разобьет и сумму пропорционально
плохо штоль? |
|||
|
4
Rovan
гуру
20.03.26
✎
09:09
|
кривой подход в хранении данных порождает нерешаемые задачи
|
|||
|
5
Dimon1C
20.03.26
✎
09:14
|
(4) абсолютно согласен, но задачка со звездочкой, именно для жителей мисты
|
|||
|
6
Dimon1C
20.03.26
✎
09:14
|
(1) тут именно разбить строку, количество как коэффициент
|
|||
|
7
PLUT
гуру
20.03.26
✎
09:15
|
(5) с пятью звездочками (чем больше звезд, тем типа выдержаннее)
|
|||
|
8
Fish
гуру
20.03.26
✎
09:16
|
(6) У тебя в каждой строке есть номер 7. Какой должен быть результат? 2 строки с номером 7 и в каждой доля от 500, 600 и 100 соответственно, или одна строка с суммой долей?
|
|||
|
9
vicof
20.03.26
✎
09:18
|
(0) SELECT s.[message-id], f.value
FROM dbo.SourceData AS s CROSS APPLY STRING_SPLIT(s.[recipient-address], ';') as f; |
|||
|
10
Dimon1C
20.03.26
✎
09:19
|
(8) да тут особо не важно как сумма доли считается, важно как разделить строку на подстроки, а там уже посчитать дело техники
|
|||
|
11
Fish
гуру
20.03.26
✎
09:23
|
(10) Ну не скажи, от этого сильно меняется алгоритм расчета.
Так одна строка с номером 7 должна быть или 3? |
|||
|
12
PLUT
гуру
20.03.26
✎
09:26
|
гуру тест от Г!С
|
|||
|
13
Dimon1C
20.03.26
✎
09:28
|
(11) каждая строка автономно считается, на примере первой 500/5 = 100 и на каждую из 3-х номеров поставить сумма 100/3
|
|||
|
14
Dimon1C
20.03.26
✎
09:28
|
(13) там потом нужно будет проссуммировать итог суммы по номерам
|
|||
|
15
PLUT
гуру
20.03.26
✎
09:30
|
(13) В 1С дробные числа реализуются через тип Число, где вы заранее строго определяете общую длину и количество знаков после запятой (точность).
Сложение и вычитание работают идеально |
|||
|
16
Fish
гуру
20.03.26
✎
09:37
|
(13) Как будешь решать проблему дробей? 100/3 = 33.33, а 33.33*3 <> 100. Куда копейку добавишь?
|
|||
|
17
Dimon1C
20.03.26
✎
09:38
|
(9) в 1С есть подобное?
|
|||
|
18
Dimon1C
20.03.26
✎
09:40
|
(16) мне бы пока понять как строку разбить "2,3,7" на несколько строк
|
|||
|
19
PLUT
гуру
20.03.26
✎
09:41
|
(17) в 1С чего только нету, даже КомандаСисьтемы() и ЗапуститьПриложение()
|
|||
|
20
Мультук
гуру
20.03.26
✎
09:41
|
(5)
{Сарказм} Аналитик не думая головой поставил задачу - получил деньги. Программист, не споря с аналитиком выполнил задачу - получил деньги. Оба свалили в закат А голова теперь должна бесплатно болеть у жителей мисты ? :-) Эмо! Орео! (греч) |
|||
|
21
Dimon1C
20.03.26
✎
09:42
|
(20) Да есть такое, сам иногда смотрю на технические решения и недоумеваю как такое можно сделать в трезвом виде
|
|||
|
22
PLUT
гуру
20.03.26
✎
09:46
|
(21) попробуй у китайских ИИчков поспрашивать, в них доступ бесплатный пока что
|
|||
|
23
Niveus
20.03.26
✎
09:51
|
(0) что такое номер? какие значения может принимать?
|
|||
|
24
PLUT
гуру
20.03.26
✎
09:52
|
(23) Номера (через запятую строкой)
это я в (0) прочитал |
|||
|
25
Dimon1C
20.03.26
✎
09:53
|
(23) числа от 1 до 9999
|
|||
|
26
Niveus
20.03.26
✎
10:06
|
Если именно запросом, я бы попробовал связать исходную таблицу левым соединением через СТРНАЙТИ с тз-шкой где строковые значеня от 1 до 9999
|
|||
|
27
maxab72
20.03.26
✎
10:03
|
3 уравнения с 5 неизвестными - не решается.
|
|||
|
28
Кирпич
20.03.26
✎
10:04
|
Чо тут думать. Взять себя в руки и написать эти пять строчек. Что это запросом 1с не решить, понятно даже самому тупому одинеснику
|
|||
|
29
Мультук
гуру
20.03.26
✎
10:07
|
(22)
deepseek подсказывает тривиальное решение, но сразу предупреждает, что так делать не надо. Увидел знакомые сигнатуры в ответе ИИ, но не проверял. Имхо то же самое решение 100500 раз было на инфостарт и мисте |
|||
|
30
spiller26
20.03.26
✎
10:44
|
(0)
ВЫБРАТЬ 0 КАК Номер ПОМЕСТИТЬ Цифры ОБЪЕДИНИТЬ ВЫБРАТЬ 1 ОБЪЕДИНИТЬ ВЫБРАТЬ 2 ОБЪЕДИНИТЬ ВЫБРАТЬ 3 ОБЪЕДИНИТЬ ВЫБРАТЬ 4 ОБЪЕДИНИТЬ ВЫБРАТЬ 5 ОБЪЕДИНИТЬ ВЫБРАТЬ 6 ОБЪЕДИНИТЬ ВЫБРАТЬ 7 ОБЪЕДИНИТЬ ВЫБРАТЬ 8 ОБЪЕДИНИТЬ ВЫБРАТЬ 9 ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Н1.Номер * 100 + Н2.Номер * 10 + Н3.Номер КАК Номер ПОМЕСТИТЬ Номера ИЗ Цифры КАК Н1 ЛЕВОЕ СОЕДИНЕНИЕ Цифры КАК Н2 ПО (ИСТИНА) ЛЕВОЕ СОЕДИНЕНИЕ Цифры КАК Н3 ПО (ИСТИНА) ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ &ИсходнаяСтрока + &Разделитель КАК Текст ПОМЕСТИТЬ Строка ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ПОДСТРОКА(ВЗ.Текст, ВЗ.Н + 1, ВЗ.К - ВЗ.Н - 1) КАК Поле1 ИЗ (ВЫБРАТЬ Номера.Номер КАК Н, МИНИМУМ(Н.Номер) КАК К, МАКСИМУМ(Н.Номер) КАК Макс, Строка.Текст КАК Текст ИЗ Номера КАК Номера ВНУТРЕННЕЕ СОЕДИНЕНИЕ Строка КАК Строка ПО (ПОДСТРОКА(Строка.Текст, Номера.Номер, 1) ПОДОБНО "[" + &Разделитель + "]" ИЛИ Номера.Номер = 0) ВНУТРЕННЕЕ СОЕДИНЕНИЕ Номера КАК Н ПО (ПОДСТРОКА(Строка.Текст, Н.Номер, 1) ПОДОБНО "[" + &Разделитель + "]") И (Н.Номер > Номера.Номер) СГРУППИРОВАТЬ ПО Номера.Номер, Строка.Текст) КАК ВЗ |
|||
|
31
spiller26
20.03.26
✎
10:44
|
(30) Дальше сами
|
|||
|
32
PLUT
гуру
20.03.26
✎
10:46
|
(30) числа от 1 до 9999 (25)
|
|||
|
33
spiller26
20.03.26
✎
10:52
|
(32)
|
|||
|
34
Dimon1C
20.03.26
✎
10:55
|
(30) Ну вот есть же гении на свете!
|
|||
|
35
PLUT
гуру
20.03.26
✎
10:56
|
(33) 👍
а такое переварит? 1,7,9,99+99 |
|||
|
36
АгентБезопасной Нацио
20.03.26
✎
10:58
|
(28) запросом вполне решается
ПодробностиВЫБРАТЬ 500 КАК Сумма, 5 КАК Количество, "2,3,7" КАК Номера ПОМЕСТИТЬ ВТ_Исходная ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 600, 2, "1,7" ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 100, 4, "1,7,9,3" ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ " 1 " КАК Номер ПОМЕСТИТЬ ВТ_Номера ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ " 2 " ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ " 3 " ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ " 4 " ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ " 5 " ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ " 6 " ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ " 7 " ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ " 8 " ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ " 9 " ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ " 10 " ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ " 11 " ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ АВТОНОМЕРЗАПИСИ() КАК НомерИсходнойСтроки, ВТ_Исходная.Сумма КАК Сумма, ВТ_Исходная.Количество КАК Количество, " " + СТРЗАМЕНИТЬ(ВТ_Исходная.Номера, ",", " ") + " " КАК Номера ПОМЕСТИТЬ ВТ_Промежуточная ИЗ ВТ_Исходная КАК ВТ_Исходная ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТ_Промежуточная.НомерИсходнойСтроки КАК НомерИсходнойСтроки, ВТ_Промежуточная.Сумма КАК Сумма, ВТ_Промежуточная.Количество КАК Количество, ВТ_Промежуточная.Номера КАК Номера, ВТ_Номера.Номер КАК Номер ПОМЕСТИТЬ ВТ_Промежуточная2 ИЗ ВТ_Промежуточная КАК ВТ_Промежуточная, ВТ_Номера КАК ВТ_Номера ГДЕ ВТ_Промежуточная.Номера ПОДОБНО "%" + ВТ_Номера.Номер + "%" ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТ_Промежуточная2.НомерИсходнойСтроки КАК НомерИсходнойСтроки, Т.КоличествоСтрок КАК КоличествоСтрок, ВТ_Промежуточная2.Сумма КАК Сумма, ВТ_Промежуточная2.Количество КАК Количество, ВТ_Промежуточная2.Номер КАК Номер ИЗ ВТ_Промежуточная2 КАК ВТ_Промежуточная2 ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ ВТ_Промежуточная2.НомерИсходнойСтроки КАК НомерИсходнойСтроки, КОЛИЧЕСТВО(ВТ_Промежуточная2.НомерИсходнойСтроки) КАК КоличествоСтрок ИЗ ВТ_Промежуточная2 КАК ВТ_Промежуточная2 СГРУППИРОВАТЬ ПО ВТ_Промежуточная2.НомерИсходнойСтроки ) КАК Т ПО Т.НомерИсходнойСтроки=ВТ_Промежуточная2.НомерИсходнойСтроки |
|||
|
37
unenu
20.03.26
✎
11:20
|
с разделением справится можно. а для математики необходимы таблицы соответствия строчного номера с числовым.
пример разделения: N Сумма Кол. Номера Разделитель 1 500 5 ,2,3,7 ,2 1 500 5 ,2,3,7 ,3 1 500 5 ,2,3,7 ,7 2 600 2 ,1,7 ,1 2 600 2 ,1,7 ,7 3 100 4 ,1,7,9,3 ,1 3 100 4 ,1,7,9,3 ,3 3 100 4 ,1,7,9,3 ,7 3 100 4 ,1,7,9,3 ,9 4 700 3 ,1,7,9,99+99 ,1 4 700 3 ,1,7,9,99+99 ,7 4 700 3 ,1,7,9,99+99 ,9 ВЫБРАТЬ
500 КАК Сумма,
5 КАК Количество,
СТРЗАМЕНИТЬ(" 2, 3,7", " ", "") КАК Номера
ПОМЕСТИТЬ ВТНабор
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
600,
2,
СТРЗАМЕНИТЬ("1, 7", " ", "")
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
100,
4,
СТРЗАМЕНИТЬ("1,7, 9,3 ", " ", "")
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
700,
3,
СТРЗАМЕНИТЬ("1,7,9,99+99", " ", "")
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
",1" КАК Разделитель
ПОМЕСТИТЬ ВТРазделители
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
",2"
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
",3"
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
",4"
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
",5"
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
",6"
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
",7"
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
",8"
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
",9"
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
АВТОНОМЕРЗАПИСИ() КАК НомерЗаписи,
ВТНабор.Сумма КАК Сумма,
ВТНабор.Количество КАК Количество,
ВЫБОР
КОГДА ПОДСТРОКА(ВТНабор.Номера, 1, 1) = ","
ТОГДА ВТНабор.Номера
ИНАЧЕ "," + ВТНабор.Номера
КОНЕЦ КАК Номера
ПОМЕСТИТЬ ВТТаблица
ИЗ
ВТНабор КАК ВТНабор
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТТаблица.НомерЗаписи КАК НомерЗаписи,
ВТТаблица.Сумма КАК Сумма,
ВТТаблица.Количество КАК Количество,
ВТТаблица.Номера КАК Номера,
ВТРазделители.Разделитель КАК Разделитель
ПОМЕСТИТЬ ВТРазделения
ИЗ
ВТРазделители КАК ВТРазделители
ЛЕВОЕ СОЕДИНЕНИЕ ВТТаблица КАК ВТТаблица
ПО (ВЫБОР
КОГДА ВТРазделители.Разделитель = ",1"
И СТРНАЙТИ(ВТТаблица.Номера, ",1") > 0
ТОГДА ИСТИНА
КОГДА ВТРазделители.Разделитель = ",2"
И СТРНАЙТИ(ВТТаблица.Номера, ",2") > 0
ТОГДА ИСТИНА
КОГДА ВТРазделители.Разделитель = ",3"
И СТРНАЙТИ(ВТТаблица.Номера, ",3") > 0
ТОГДА ИСТИНА
КОГДА ВТРазделители.Разделитель = ",4"
И СТРНАЙТИ(ВТТаблица.Номера, ",4") > 0
ТОГДА ИСТИНА
КОГДА ВТРазделители.Разделитель = ",5"
И СТРНАЙТИ(ВТТаблица.Номера, ",5") > 0
ТОГДА ИСТИНА
КОГДА ВТРазделители.Разделитель = ",6"
И СТРНАЙТИ(ВТТаблица.Номера, ",6") > 0
ТОГДА ИСТИНА
КОГДА ВТРазделители.Разделитель = ",7"
И СТРНАЙТИ(ВТТаблица.Номера, ",7") > 0
ТОГДА ИСТИНА
КОГДА ВТРазделители.Разделитель = ",8"
И СТРНАЙТИ(ВТТаблица.Номера, ",8") > 0
ТОГДА ИСТИНА
КОГДА ВТРазделители.Разделитель = ",9"
И СТРНАЙТИ(ВТТаблица.Номера, ",9") > 0
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ)
ГДЕ
НЕ ВТТаблица.НомерЗаписи ЕСТЬ NULL |
|||
|
38
АгентБезопасной Нацио
20.03.26
✎
11:44
|
(35) а что значит "99+99" ?
(37) а нахрена какая-то "таблица соответствия"? и что мешает ее сгенерить-то, если уж так надо? полтора десятка строк лишних в запросе... |
|||
|
39
PLUT
гуру
20.03.26
✎
11:50
|
(38) у бабаробота рука дрогнула
|
|||
|
40
unenu
20.03.26
✎
11:53
|
(38) автор что-то там вычисляет по номерам, а номера в задаче строчные.
|
|||
|
41
АгентБезопасной Нацио
20.03.26
✎
11:55
|
(39) Ну, значит, не распределится.
Можно и обработку ошибок таких сделать, но лениво... Сделать вообще можно всё.. Я, правда, нихрена не понял, что пропорционально чему куда распределять. |
|||
|
42
АгентБезопасной Нацио
20.03.26
✎
11:57
|
(40) ну и работай со строками.
|
|||
|
43
Fish
гуру
20.03.26
✎
11:57
|
(41) См (13)
|
|||
|
44
АгентБезопасной Нацио
20.03.26
✎
12:09
|
(43) ну тогда к (36) можно добавить
ВЫБРАТЬ ВТ_Промежуточная3.Номер КАК Номер, СУММА((ВТ_Промежуточная3.Сумма/ВТ_Промежуточная3.Количество)/ВТ_Промежуточная3.КоличествоСтрок) КАК НекаяПропоЙция ИЗ ВТ_Промежуточная3 КАК ВТ_Промежуточная3 СГРУППИРОВАТЬ ПО ВТ_Промежуточная3.Номер |
|||
|
45
trooba
20.03.26
✎
13:10
|
(0) Использовать СКД и функцию БСП // Выполняет пропорциональное распределение суммы в соответствии
// с заданными коэффициентами распределения. // // Параметры: // РаспределяемаяСумма - Число - сумма, которую надо распределить, если сумма равна 0 - то возвращается Неопределено; // Если передана отрицательная - расчет по модулю и после инверсия знаков результата. // Коэффициенты - Массив - коэффициенты распределения, должны быть положительны или отрицательными одновременно // Точность - Число - точность округления при распределении. Необязателен. // // Возвращаемое значение: // Массив - массив размерностью равный массиву коэффициентов, содержит // суммы в соответствии с весом коэффициента (из массива коэффициентов). // В случае, если распределить невозможно (кол-во коэффициентов = 0 // есть коэффициенты с отрицательным значением или суммарный вес коэффициентов = 0), // тогда будет возвращено Неопределено. // // Пример: // // Коэффициенты = Новый Массив; // Коэффициенты.Добавить(1); // Коэффициенты.Добавить(2); // Результат = ОбщегоНазначенияКлиентСервер.РаспределитьСуммуПропорциональноКоэффициентам(1, Коэффициенты); // // Результат = [0.33, 0.67] // Функция РаспределитьСуммуПропорциональноКоэффициентам(Знач РаспределяемаяСумма, Знач Коэффициенты, Знач Точность = 2) Экспорт |
|||
|
46
unenu
20.03.26
✎
13:42
|
(45) СКД - читерство. в задаче условие - только запрос.
|
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |