Как в запросе преобразовать таблицу в одну строку с разделителями?

1. serge_focus 4 28.08.12 15:07 Сейчас в теме
Например, есть таблица:

Название1
Название2
Название3
Название4

Запрос возвращает строку:
Название1; Название2; Название3; Название4;

таблицу обработать нужно именно в запросе...

Заранее всем спасибо !
PotapAV; yaroslav.artem; Kramarenkoav; Мах; +4 Ответить
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
37. AllexSoft 03.09.13 10:11 Сейчас в теме
(1) serge_focus, если в скд то можно с помощью встроенной функции... а если обычным запросом то как в (33) kuzyara больше никак
103. ildarovich 7861 09.09.13 16:51 Сейчас в теме
(1) Считаете ли Вы вопрос закрытым, уважаемый serge_focus?
105. serge_focus 4 11.09.13 14:31 Сейчас в теме
(103) :) Ну для себя я вопрос закрыл еще год назад.
Но - затем возникло новое обсуждение.
Как по мне обсуждение интересное.
И Ваша статья тоже понравилась. В ней ПЛЮС!
Но все-таки жаль , что на уровне системы ЗАПРОСОВ, 1С не реализуют функцию вида СУММА(ТекстоваяСтрока).
И приходится изощрятся...
Suslik_Johns; Signori; Lotar; +3 Ответить
2. zamichnik 28.08.12 15:23 Сейчас в теме
А Название1 - Название4 это поля таблицы?
Тогда как-нибудь так:
ВЫБРАТЬ
   ВашаТаблица.Название1 + ";" + ВашаТаблица.Название2 + ";" + ВашаТаблица.Название3 + ";" + ВашаТаблица.Название4 КАК ВыходнаяСтрока
ИЗ
   Справочник.ВашаТаблица КАК ВашаТаблица
jushkaaa; +1 Ответить
3. serge_focus 4 28.08.12 15:53 Сейчас в теме
(2) zamichnik,
Название1
Название2....
это строки таблицы
НЕ ПОЛЯ ;(
5. andrewks 1370 28.08.12 16:09 Сейчас в теме
(3) никак. делай при обработке результата запроса
4. zamichnik 28.08.12 16:08 Сейчас в теме
И количество таких записей, конечно же, неизвестно?
6. serge_focus 4 28.08.12 17:25 Сейчас в теме
(4) zamichnik , - конечно же, неизвестно...

(5) ndrewks, - неужели все так грустно ?...
Что-ж только через: запрос > обработка_запроса > массив > ВременнаяТаблица > передать ВременнаяТаблица в запрос...?
9. zamichnik 28.08.12 18:49 Сейчас в теме
(6) serge_focus,
тогда, похоже, andrewks прав - никак...
А не проще тогда формировать строку уже в обходе результата запроса и передавать её, уже скомпонованную куда угодно, в том числе и параметрически в любой следующий запрос?
10. serge_focus 4 28.08.12 19:37 Сейчас в теме
(9) zamichnik ,- собственно так и пришлось сделать
запрос > обработка_результатов_запроса > ВременнаяТаблица > передать ВременнаяТаблица как параметр передал в запрос...

Но надеялся, что обработать все можно прямо а ЗАПРОСЕ на сервере...
11. zamichnik 28.08.12 20:04 Сейчас в теме
(10) serge_focus,
Посетила мысль :) Ведь в принципе, можно попробовать динамически составить текст запроса, тогда получится желаемое...
Но... При этом по-любому сначала нужно как-то определить количество записей, всё равно одним запросом не получается...
user821118; +1 Ответить
15. andrewks 1370 28.08.12 22:48 Сейчас в теме
(11) zamichnik, плохая идея для данного случая. а если строк будет очень много? это ж какое соединение надо делать-то? тут при обработке результата надо делать.

вот если бы надо было, наоборот, разбить строку с разделителем на составляющие - это пожалуйста, порождающие запросы прекрасно пишутся на 1С-диалекте sql
104. ildarovich 7861 10.09.13 13:10 Сейчас в теме
(11)(12)(14)(33)(37)(41)(64)(75) - Всем, кто интересовался данной темой, предлагаю ознакомится с моим решением в статье Агрегатное суммирование строк в запросе - сложно, но не невозможно
Euroset1; +1 Ответить
12. beldieff 28.08.12 20:08 Сейчас в теме
(10) serge_focus,
Но надеялся, что обработать все можно прямо а ЗАПРОСЕ на сервере...
А каким образом? Запрос -- это запрос, а обработка запроса -- это обработка запроса. Извините за капитанство.

Да и язык беден всего то десяток функций.
16. serge_focus 4 28.08.12 23:18 Сейчас в теме
(12) beldieff
> обработка_результатов_запроса > -это и есть
Результат =""
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Результат = Результат + Выборка.Название;
КонецЦикла;

как уже написал в (14) HeadHunter2007

(13) juntatalor - а вот это интересно ...
пороюсь в СКД . Просто не знал , что в СКД есть подобный функционал. Большое вам спасибо! ;)
17. beldieff 28.08.12 23:42 Сейчас в теме
(16) serge_focus,
обработка_результатов_запроса > -это и есть
Результат =""
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Результат = Результат + Выборка.Название;
КонецЦикла;
как уже написал в (14) HeadHunter2007
Т.е. Выбрать из таблицы все строки в одну и выбрать, а потом конкотенировать одно и то же?
18. andrewks 1370 28.08.12 23:45 Сейчас в теме
(16) serge_focus, в СКД это тоже реализовано как обработка результата запроса, т.е. оперировать этим полем напрямую в запросе не получится. если же надо только на выходе - тогда да. только чем тогда не понравилась обработка результата обычного запроса?
19. serge_focus 4 29.08.12 00:43 Сейчас в теме
(18) andrewks - Да собственно я и сделал через обработку результата запроса . Только у меня получается запрос "многоэтажный" и на одном из "этажей" есть необходимость свернуть таблицу значений (если она не пустая для данных параметров) в строку с разделителями. И получается что приходится на предпоследнем этапе для всех строк большого запроса после ролверки условия перебором в цыкле сворачивать отобранные другим запросом строки таблицы в строку с разделителями, Все эти строки с разделителями и ключем собирать во временной таблице, передавать ее в запрос, а затем уже в зависимости от условий отбора выводить результат.
И все это как-то "не быстро" получается. Вот и вожусь с оптимизацией...
7. Akuji 22 28.08.12 17:27 Сейчас в теме
а зачем передавать их в виде строки дальше?
8. zamichnik 28.08.12 18:45 Сейчас в теме
(7) Akuji,
Ну, например, вывести в какой-нибудь однострочный терминал...
13. juntatalor 63 28.08.12 20:53 Сейчас в теме
Если у вас какой-то отчет, то требуемый функционал есть в СКД (функции Массив(), СоединитьСтроки()).

Если использование СКД по каким-то причинам нежелательно, обрабатывайте результат запроса.
Intercititude; Insanity; manyaxa; s_vidyakin; serge_focus; +5 Ответить
14. HeadHunter2007 28.08.12 22:37 Сейчас в теме
Результат =""
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Результат = Результат + Выборка.Название;
КонецЦикла;
Artem1405; +1 Ответить
20. serge_focus 4 29.08.12 00:54 Сейчас в теме
Грубо говоря предельное упрощение задачи - это:
есть таблица документов содержащих табличную часть
нужно сделать таблицу с сылкой на документ , в одном из полей которой содержится строка, которая равняется результату суммы текстовых строк , разделенных ; табличной части этого документа...
21. andrewks 1370 29.08.12 11:00 Сейчас в теме
(20) serge_focus, сначала сделай запрос с обработкой ТЧ, затем обработай результат, закинь в ТЗ ссылки и текстовые представления ТЧ, и кидай параметром в следующий запрос, где эту ТЗ зальёшь во временную таблицу, а дальше - делай с ней чё хочешь - соединяй, выбирай, и т.д.
22. serge_focus 4 29.08.12 13:19 Сейчас в теме
(21) andrewks - я вобщем-то по примерно такой схеме и сделал. Но занялся оптимизацией и подумал: - А вдруг можно сделать еще как-то по другому . Все одним запросом. Ан НЕТ :( .
Всем спасибо!
23. rar_xxx 23 02.09.13 01:32 Сейчас в теме
(22) serge_focus, все таки можно, здесь Консоль изучения запросов, 86 задание, мало того что надо собрать строки таблицы в одну, дык еще и по алфавиту ). Тему поднимали здесь, Mista. Осталась без ответа. Предлагаю обсудить. СКД, обработка результата запроса не подходит, все чисто в запросе.
24. andrewks 1370 02.09.13 15:37 Сейчас в теме
(23) rar_xxx,
все таки можно


ну, приведите решение, раз можно.

и, кстати, какое точно задание? ссылка не просматривается
25. rar_xxx 23 02.09.13 16:11 Сейчас в теме
(24) andrewks, если бы я его решил, то вопроса бы не было) И это задание 13 человек точно решило ) Можно даже фамилии в списке посмотреть.


Вот задание:
"Для каждого производителя перечислить в алфавитном порядке с разделителем "/" все типы выпускаемой им продукции."

Производитель - справочник и Типы оборудования - справочник. То есть кол-во типов продукции не ограничено.
26. andrewks 1370 02.09.13 18:07 Сейчас в теме
(25) rar_xxx, задача не имеет решения в общем виде в рамках нединамического запроса 1С без СКД.

что там и как они "нарешали", мне отсюда не видно, поэтому судить не берусь
27. andrewks 1370 02.09.13 18:08 Сейчас в теме
(25) rar_xxx,
"Для каждого производителя перечислить в алфавитном порядке с разделителем "/" все типы выпускаемой им продукции."
Производитель - справочник и Типы оборудования - справочник.


и какая связь между этими справочниками?
28. rar_xxx 23 02.09.13 18:27 Сейчас в теме
(27) andrewks, в регистре сведений, производитель, модель, типОборудования
29. andrewks 1370 02.09.13 18:41 Сейчас в теме
(28) rar_xxx, а где можно посмотреть дословный текст задания?
31. rar_xxx 23 02.09.13 20:21 Сейчас в теме
(29) andrewks, я скопировал полностью, дословно, задание. Оригинал 86 в сервисе its22.ru, ссылку я скидывал.
35. andrewks 1370 03.09.13 08:18 Сейчас в теме
(31) rar_xxx, ну, тогда не знаю. можно пофантазировать, например, там нет жёсткого условия, что это должно быть в одну строку.
36. rar_xxx 23 03.09.13 09:21 Сейчас в теме
(35) andrewks, ну я уже нафантазировал на макс 3 типа оборудования, 3мя внутренними соединениями одинаковой таблицы, как еще собирать строчку из нескольких, я пока не представляю. У них в справочнике типОборудования всего 3 типа и мой ответ идентичен ихнему, но он не принимается системой, пишет несоответствие типов, ну это там часто ихняя ошибка проверки задания. я им отправил запрос попросил намекнуть куда копать, если он не верен, пока молчат, жду )
38. andrewks 1370 05.09.13 10:23 Сейчас в теме
(36) rar_xxx, новостей нет? очень интересно, будет ли революционное решение проблемы :)
39. rar_xxx 23 05.09.13 10:35 Сейчас в теме
(38) andrewks, блин сервис молчит, сейчас еще писмишко отправлю, у меня время капает и рейтинг из за этого тоже ( добился от одной участницы решения, она решала путем 3х левых соединений с таблицей различных производителей.
Я решал путем 3х внутренних соединений в условиях соединений предусмотрел сортировку.
40. andrewks 1370 05.09.13 10:51 Сейчас в теме
(39) rar_xxx, ну, т.е. речь идёт не об универсальном решении, а рассчитаном на не более, чем Х (=3) значений, я правильно понял?
44. rar_xxx 23 05.09.13 12:19 Сейчас в теме
(40) andrewks, ну вот тут то и вопрос к создателям сервиса, я могу написать текст запроса на конечное кол-во ТиповОборудования, в условии задачи не говорится о том что например "предположим что макс. кол-во оборудования - 3".
Исходя из того что 13 человек эту задачу решили, я сделал предположение, что возможно как то написать запрос на бесконечное кол-во типовОборудования. Хотя вот одна участница данного мероприятия, которая решила эту задачу, мне написала свой запрос который тоже ограничен 3мя типамиОборудования.
Я конечно мог ответить ее запросом и пройти дальше, но сейчас мне уже интересно в чем истина )
45. andrewks 1370 05.09.13 12:26 Сейчас в теме
(44) rar_xxx, я всё-таки считаю, что решения в общем виде не существует (в рамках чистого запроса 1С), и имеет место некорректное задание
50. ildarovich 7861 05.09.13 13:44 Сейчас в теме
(44)(45)(46)(47)(49) У меня есть решение. Из-за своей громоздкости практического значения оно, на мой взгляд, не имеет. Говорю о нем лишь для того, чтобы Вы не были так категоричны в оценках возможностей языка запросов. Публиковать я его пока не решился, так как обычная реакция на такие мои решения: "вот это жесть!". Сомневаюсь, что 13 человек применили именно его. Думаю, что там шла речь о чем-то вроде
ВЫБРАТЬ 
МАКСИМУМ(ВЫБОР НомерСтроки КОГДА 1 ТОГДА Строка ИНАЧЕ """" КОНЕЦ) + МАКСИМУМ(ВЫБОР НомерСтроки КОГДА 2 ТОГДА Строка ИНАЧЕ """" КОНЕЦ) + ... 
ИЗ Строки
Номера строк можно получить тэта-соединением, подсчитав для каждой строки число меньших строк.
Мое решение "агрегатная конкатенация" основано на последовательном попарном соединении смежных строк и начальном расположении строк на листьях бинарного дерева. Применять пришлось лишь однажды - для очистки артикулов от мусора.
denmon88; +1 Ответить
51. andrewks 1370 05.09.13 14:04 Сейчас в теме
(50) ildarovich, сказав "А" - говорите "Б".

хотелось бы увидеть решение, если оно есть, каким бы ужасным оно не было (лично у меня интерес сугубо теоретический)
52. Новиков 292 05.09.13 14:18 Сейчас в теме
(50) ildarovich, давайте посмотрим на Ваше решение, чтобы мы не были столь категоричны. Я бы (лично) с удовольствием бы на него взглянул. Если настолько стеснительно оное вам выкладывать, напишите в личку. Со своей стороны, даю слово, что если Ваше решение решает задачу с произвольным количеством строк только одним запросом на языке 1С, который можно скопировать в консоль и получить желаемый результат - я, посыпав голову пеплом, напишу что вы действительно это сделали. Все вопросы быстродействия, громоздкости и т.д. опускаем, т.к. к существу вопроса они не относятся. Вопрос, если вы не против, поставим так: есть таблица ТАБЛ с одним полем КОЛОНКА. Количество записей в таблице - произвольное. Ваш запрос возвращает одну запись, состоящую из одного поля, значением которой будет перечислением всех записей таблице ТАБЛ, как вы об этом и упомянули выше.

Прошу рассматривать мое сообщение не как тонкий троллинг, а как реальное желание посмотреть на оригинальное авторское решение.
54. ildarovich 7861 05.09.13 16:26 Сейчас в теме
(52) А чем будет задаваться порядок соединяемых строк? Ведь операция конкатенации не коммутативна(результат зависит от порядка операндов)? Значит, еще должен быть столбец, который определит порядок строк в соединении? Могу я рассчитывать, что строки будут пронумерованы?
55. rar_xxx 23 05.09.13 16:48 Сейчас в теме
(54) ildarovich, перед всеми действиями ИМХО надо нумеровать, ну хотя все зависит от того каким алгоритмом ты собираешься собирать строки(я собирал 3мя внутренними соединениями и по номеру ориентировался добавлять/наименование или нет). Нумерую внутренним соединением таблицы саму с собой, в условии соединения участвуют наименования указываешь <= или >= в зависимости от того по алфавиту надо нумеровать или нет.
57. ildarovich 7861 05.09.13 17:10 Сейчас в теме
(55) Кажется, что сортировка подстрок по алфавиту перед соединением в одну строку - довольно экзотическое требование. Не хочется сужать задачу. С другой стороны, тут есть определенная проблема, что одинаковые подстроки получат после сортировки по алфавиту одинаковые номера. И придется, кроме номера еще заводить поле "число повторов". То есть и случай не типичный и задача усложняется. Поэтому я и спросил: не будет ли возражений, если в таблице ТАБЛ будет не одно поле КОЛОНКА, а два. Второе -"НомерСтроки" - порядковый номер строки в результирующем соединении. Тут должен ответить автор задачи (52), господин Новиков.
59. rar_xxx 23 05.09.13 17:16 Сейчас в теме
(57) ildarovich, Слишком много воды, вот задача подобная той из за которой создан этот топик "Для каждого производителя перечислить в алфавитном порядке с разделителем "/" все типы выпускаемой им продукции."
Производители и типы оборудования это справочники.
Не важно что это вообще будет просто таблица с >2 колонками любого содержания, 2я типа строка ее и надо собрать.
И как написал здесь (58) Новиков, забываем о порядке, не в порядке проблема.
Напиши свой запрос.
58. Новиков 292 05.09.13 17:12 Сейчас в теме
(54) ildarovich, давайте, если вы не против, чтобы соблюсти все правила исходной задачи, будем считать, что в поле КОЛОНКА все значения уже упорядочены по алфавиту, и в точно таком же порядке, нужно получить конечный список. Кажется, что такое допущение, не умоляет общности решения. Хотя, если вам будет угодно, мы вообще можем опустить порядок. В каком будет собираться - в таком и будет. Кажется, опять же, что для решения задачи в таком виде, порядок, не очень важен. Полагаю, что отсутствие столбца, для вас не будет являться главной проблемой.
60. ildarovich 7861 05.09.13 17:24 Сейчас в теме
(58) В моем запросе столбец "НомерСтроки" требуется. Но я все равно еще буду должен все протестировать - на это уйдет какое-то время. Что же, сделаю два варианта. С повторами будет еще сложнее, но постараюсь.
(59) Я понимаю Ваше нетерпение, но сейчас пока на работе, вечером или уже завтра постараюсь все сделать. А по поводу того, что порядок не важен - совершенно не правы. Вспомните: "казнить нельзя помиловать".
68. Новиков 292 05.09.13 23:39 Сейчас в теме
(60) ildarovich, с решением спешить не нужно. Хотелось бы увидеть законченный единый оттестированный запрос. Мы же не на экзамене, чтобы на время решать. Сколько нужно времени для того, чтобы появился такой запрос - столько и подождем. Ожидание только подогреет интерес к оригинальному авторскому решению :)
67. andrewks 1370 05.09.13 23:03 Сейчас в теме
(54) ildarovich, я так понимаю, вопрос сводится к определению допустимости операции сравнения строк, т.к. в этом случае даже без колонки "номер строки" можно пронумеровать строки.

лично я думаю, что достаточно указать, например, так: таблица упорядочивается по некоторому столбцу "Х", в случае с одним столбцом из (52) - соответственно, по этому одному столбцу "КОЛОНКА"
ildarovich; +1 Ответить
69. ildarovich 7861 06.09.13 01:19 Сейчас в теме
(67) Отличное предложение!
71. Новиков 292 06.09.13 10:51 Сейчас в теме
Уважаемые коллеги-читатели. Для тех, кто не читает выше стоящие комменты, я сделаю маленький флеш-форвард:
Дано:
    Текст задачи в (52);
    Уточнения задачи в (58);
Решение:
    1. Ряд коллег, и я в т.ч., высказали твердое убеждение, что сформулированную задачу, в том виде, в котором она представлена, решения не имеет;
    2. Один коллега, ildarovich, утверждает что у него есть решение и он его нам покажет.

Мы все ожидании решения. Полагаю, что других точек зрения на решение задачи, быть уже не может. Поэтому, я предлагаю, чтобы упростить понимание, сразу всем ниже-отписавшимся указывать к какой точке зрения он склоняется. (п.1 или п.2). При этом, следует помнить, что решение должно быть представлено в виде одного запроса на языке запросов 1С, который можно скопировать в консоль, и сразу получить результат.

Я бы еще голосовалку прикрутил к этой теме (чтоб оценить в количественном выражении число правых/ошибающихся).
mi13; Мах; insurgut; andrewks; +4 Ответить
73. s_vidyakin 63 06.09.13 11:25 Сейчас в теме
(71) Новиков, я думаю ildarovich ошибается, т.к. чтобы написать запрос с тета-соединением надо сделать столько соединений, сколько строк в таблице и выбрать максимальную по длине строку
30. serge_focus 4 02.09.13 19:38 Сейчас в теме
Всем привет!
(23) rar_xxx, сервис на its22.ru конечно может и интересный , не спорю.
Но если у Вас есть решение и можете им поделится - то ждем.
Заранее СПАСИБО! ;)
32. serge_focus 4 03.09.13 01:58 Сейчас в теме
Пропустил перед ответом посты с 25 по 30 - ответ написал сразу , а отправил когда вернулся за комп.
Вот что я уяснил :
То, что нужно сделать мне - можно сделать только обработкой выборки из запроса на встроенном языке, в обработке результата запроса .
---
В самом запросе можно сделать фиксированную конкатенацию строк, причем только конечной длины и без преобразования типов.

Например:
выбрать
Т.Склад.Наименование+"["+Т.Помещение.Наименование+"]."+Т.Номенклатура.Наименование
из РегистрНакопления.ТоварыНаСкладах.Остатки(,) как Т

Если попробовать сделать конкатенацию с полями, отличными от строковых, будет синтаксическая ошибка.
33. kuzyara 1912 03.09.13 03:35 Сейчас в теме
столько комментариев, и все пустые:)
я делал так:
ВЫБРАТЬ
	Контрагенты.Наименование
ПОМЕСТИТЬ табл1
ИЗ
	Справочник.Контрагенты КАК Контрагенты
;
ВЫБРАТЬ
	Контрагенты.Наименование
ПОМЕСТИТЬ табл2
ИЗ
	Справочник.Контрагенты КАК Контрагенты
;
ВЫБРАТЬ
	Контрагенты.Наименование
ПОМЕСТИТЬ табл3
ИЗ
	Справочник.Контрагенты КАК Контрагенты
;
ВЫБРАТЬ ПЕРВЫЕ 1
Табл1.Наименование+", "+Табл2.Наименование+", "+Табл3.Наименование
ИЗ Табл1, Табл2, Табл3
ГДЕ (Табл1.Наименование<>Табл2.Наименование)И(Табл2.Наименование<>Табл3.Наименование)И(Табл1.Наименование<>Табл3.Наименование)
Показать

думаю подход ясен
зы: или использовать всю мощь внутренних sql-запросов, там и переменные, и хранимые процедуры, и даже рекурсия есть!
NN2P; usercool; 1108; +3 Ответить
34. andrewks 1370 03.09.13 08:15 Сейчас в теме
(33) kuzyara, запрос составлен под фиксированное число полей, а в задаче число полей - произвольное. sql-запросы тоже нельзя использовать
41. s_vidyakin 63 05.09.13 11:44 Сейчас в теме
Чем не подходит СКД? Функция Массив() свернет в строку все поля, сгруппируешь по документу и возвратишь таблицу
Документ1 - Название11;Название12;Название13
Документ2 - Название21;Название22;Название23
43. rar_xxx 23 05.09.13 12:13 Сейчас в теме
(41) badboychik, (42) insurgut, Я писал, все должно произойти в Запросе, задача состоит составлении правильного текста запроса.
47. s_vidyakin 63 05.09.13 12:37 Сейчас в теме
(43) rar_xxx, в чистом запросе решить невозможно, забудь. Тебе в динамический список надо голый запрос что ли?
Если бы в оракле на PL-SQL писал то можно, или хотя бы на T-SQL. А тут вам не там ))
48. insurgut 207 05.09.13 12:48 Сейчас в теме
(47) badboychik, в MSSQL тоже отлично можно процедуры использовать самописные :)
72. s_vidyakin 63 06.09.13 11:19 Сейчас в теме
(48) insurgut, читай (65), я это имел в виду, а не какие то самописные процедуры
76. insurgut 207 06.09.13 15:03 Сейчас в теме
(72) badboychik, ну понятно, я лишь к тому прокомментировал - что не штатными средствами (запросом) 1С - сделать это реально :)
107. KAV2 156 21.03.18 09:51 Сейчас в теме
(41) В динамическом списке надо бы.
42. insurgut 207 05.09.13 11:52 Сейчас в теме
Предложу вариант:
ЗначениеВСтрокуВнутр(Запрос.Выполнить().Выгрузить());
46. insurgut 207 05.09.13 12:27 Сейчас в теме
Что-то мне подсказывает, что нереально это, не зная количество элементов осуществить задуманное в запросе.
49. Новиков 292 05.09.13 12:55 Сейчас в теме
Это классическая задача по созданию списка с некоторыми разделителями из строк таблицы. В разных СУБД она решается по разному. В языке запросов 1С в прямом виде она решена быть не может, т.к. нет соответствующих встроенных функций. В MS SQL, DB2, MySQL, Oracle, PostgreSQL - есть, поэтому запросом там можно получить желаемое.
53. insurgut 207 05.09.13 14:22 Сейчас в теме
Все ждем с нетерпением :) Каким бы громоздким не было решение...
56. rar_xxx 23 05.09.13 17:10 Сейчас в теме
Вся проблема в том, что в поле выборки запроса нельзя написать запрос(хотя это тоже не помогло бы), в скуле можно. Запрос можно писать в условие связи или в условие.
Связь это грубо говоря циклы вложенные друг в друга, и на каждом этапе проверки связи ты находишься внутри последнего вложенного цикла, соответственно допустим таблица состоит из 1ой колонки и как ты этими связями не крути ты сможешь собрать 1 строчку из количества полей равного количеству циклов, а в нашем случае количеству таблиц. Потому что на каждом шаге циклов ты сможешь собирать только новую строчку, к старым ты уже доступа ни как не получишь, в этом и вся соль.
61. ildarovich 7861 05.09.13 19:50 Сейчас в теме
Добавил вознаграждение для поднятия интереса к теме
62. AnryMc 849 05.09.13 20:15 Сейчас в теме
ИМХО: В СКД можно почитать о

Вычислить
ВычислитьВыражение
ВычислитьВыражениеСГруппировкойМассив
ВычислитьВыражениеСГруппировкойТаблицаЗначений
64. таксяк 05.09.13 20:55 Сейчас в теме
(62) СКД это прекрасно, но речь о запросе
63. Sabfir 05.09.13 20:48 Сейчас в теме
65. таксяк 05.09.13 21:15 Сейчас в теме
Задача решается через использование Recursive CTE, PIVOT, WHILE loop или FOR XML PATH.
Ни один из них языком 1С не поддерживается.
Тут задача не на логику, а на знание нужной функции, которой пока в 1С не реализовано.
66. andrewks 1370 05.09.13 22:58 Сейчас в теме
(65) таксяк, в отсутствие нужных функций в 1С задача как раз получается уже на логику :)
70. таксяк 06.09.13 04:05 Сейчас в теме
Возможности получить запись вместе со следующей в 1С нет
Возможности сохранить значение переменной в цикле запроса нет
Возможности сделать в ТЗ из колонок строки тоже нет
Какие еще могут быть варианты?
Если только порадуют чем-то в новых релизах
74. serge_focus 4 06.09.13 13:29 Сейчас в теме
В начале формирования темы по аналогии с SQL надеялся что и в 1С в 8.2 уже появилась подобная возможность.
Общение на форумах убедило сделать через собственную функцию с выгрузкой результатов во временную таблицу, и использованием ее в следующем запросе.
По этому с нетерпением жду, что меня удивят и я окажусь не правым. ;)
75. mptt 16 06.09.13 14:59 Сейчас в теме
Обычная задача группировки, но если нет агрегатной функции
которая решает эту задачу -значит нет решения...
Не один SQL-диалект в том числе 1Ский не решает подобных задач.
77. insurgut 207 06.09.13 15:06 Сейчас в теме
Я аж заинтригован решением, самом пару раз сталкивался с необходимостью получения такого результата непосредственно в запросе :)
78. mptt 16 06.09.13 15:13 Сейчас в теме
Все дело в том, что при обработке очередной записи исходных таблиц
запрос "не помнит" результата обработки предыдущих записей
Такой "памятью" оюладают лишь агрегатные функции сохраняя результат
в выходной таблице..
79. insurgut 207 06.09.13 15:22 Сейчас в теме
Надеюсь ildarovich понимает, что от него ожидают увидеть не функцию на языке 1С, которая объединит в цикле кучу операторов "ВЫБРАТЬ" (http://infostart.ru/public/160707/), а именно код на языке запросов 1С (который как писали выше можно будет просто скопировать в консоль, нажать выполнить и получить результат), в котором будет реализована данная задача :)
80. echo77 1881 06.09.13 18:10 Сейчас в теме
Можно в запросе сделать так:
1. Пронумеровать строки в запросе (http://kb.mista.ru/article.php?id=703)
2. Выбирать из получившейся ВТ данные объединением запросов, где в каждом запросе будет условие НомерСтроки = 1 .. 4
3. Получившуюся таблицу сгруппировать по, для каждого поля использовать функцию Максимум() / Минимум() - без разницы
4. Результат группировки соединить в одну строку Название1 + "; " + Название2 ...
5. PROFIT!
81. insurgut 207 06.09.13 19:36 Сейчас в теме
(80) echo77, поподробнее пункт номер 2 и особенно 4 вы как реализовать предлагаете? Пример не покажете нам? :)
82. m-serg74 46 06.09.13 19:40 Сейчас в теме
(81) insurgut, да очередной чёс не подумавши...
83. andrewks 1370 06.09.13 19:48 Сейчас в теме
(81) insurgut, он предлагает решение под сабж (который в самом-самом верху, пост №1 :) )
84. ildarovich 7861 07.09.13 01:41 Сейчас в теме
Вот искомый запрос
ВЫБРАТЬ РАЗЛИЧНЫЕ Дано.Колонка НомерСтроки, Дано.Колонка а ПОМЕСТИТЬ Дано ИЗ &Дано КАК Дано;
ВЫБРАТЬ 0 ё ПОМЕСТИТЬ Р0 ОБЪЕДИНИТЬ ВЫБРАТЬ 1;
ВЫБРАТЬ 2 * Р1.ё + Р0.ё ё ПОМЕСТИТЬ Р10 ИЗ Р0 Р1, Р0;
ВЫБРАТЬ 4 * Р32.ё + Р10.ё ё ПОМЕСТИТЬ Р3210 ИЗ Р10 Р32, Р10;
ВЫБРАТЬ 16 * Р7654.ё + Р3210.ё ё ПОМЕСТИТЬ Р76543210 ИЗ Р3210 Р7654, Р3210;
ВЫБРАТЬ 8 * Р76543210.ё + 2 * Р10.ё + Р0.ё + 1 ё ПОМЕСТИТЬ РА9876543210 ИЗ Р76543210, Р10, Р0;
ВЫБРАТЬ НомерСтроки, ё, ПОДСТРОКА(а, ё, 1) а ПОМЕСТИТЬ Буквы ИЗ Дано, РА9876543210;
ВЫБРАТЬ НомерСтроки, МАКСИМУМ(ё) СтрДлина ПОМЕСТИТЬ Длины ИЗ Буквы ГДЕ а > "" СГРУППИРОВАТЬ ПО НомерСтроки;
ВЫБРАТЬ Буквы.НомерСтроки, ё,ВЫБОР а КОГДА " " ТОГДА " " ИНАЧЕ а КОНЕЦ а ПОМЕСТИТЬ СокрП ИЗ Буквы СОЕДИНЕНИЕ Длины ПО Буквы.НомерСтроки = Длины.НомерСтроки И ё <= СтрДлина;
ВЫБРАТЬ ё + СУММА(ЕСТЬNULL(СтрДлина, 0)) ё, а Поместить Таб ИЗ СокрП КАК Буквы ЛЕВОЕ СОЕДИНЕНИЕ Длины ПО Буквы.НомерСтроки > Длины.НомерСтроки СГРУППИРОВАТЬ ПО Буквы.НомерСтроки, ё, а;
ВЫБРАТЬ ВЫРАЗИТЬ(ё/2 КАК ЧИСЛО(15,0)) е, ё, а ПОМЕСТИТЬ Шаг ИЗ Таб; УНИЧТОЖИТЬ Таб;
ВЫБРАТЬ е ё, МАКСИМУМ(ВЫБОР е*2-ё КОГДА 1 ТОГДА а ИНАЧЕ "" КОНЕЦ) + МАКСИМУМ(ВЫБОР е*2-ё КОГДА 1 ТОГДА "" ИНАЧЕ а КОНЕЦ) а ПОМЕСТИТЬ Таб ИЗ Шаг СГРУППИРОВАТЬ ПО е; УНИЧТОЖИТЬ Шаг;
ВЫБРАТЬ ВЫРАЗИТЬ(ё/2 КАК ЧИСЛО(15,0)) е, ё, а ПОМЕСТИТЬ Шаг ИЗ Таб; УНИЧТОЖИТЬ Таб;
ВЫБРАТЬ е ё, МАКСИМУМ(ВЫБОР е*2-ё КОГДА 1 ТОГДА а ИНАЧЕ "" КОНЕЦ) + МАКСИМУМ(ВЫБОР е*2-ё КОГДА 1 ТОГДА "" ИНАЧЕ а КОНЕЦ) а ПОМЕСТИТЬ Таб ИЗ Шаг СГРУППИРОВАТЬ ПО е; УНИЧТОЖИТЬ Шаг;
ВЫБРАТЬ ВЫРАЗИТЬ(ё/2 КАК ЧИСЛО(15,0)) е, ё, а ПОМЕСТИТЬ Шаг ИЗ Таб; УНИЧТОЖИТЬ Таб;
ВЫБРАТЬ е ё, МАКСИМУМ(ВЫБОР е*2-ё КОГДА 1 ТОГДА а ИНАЧЕ "" КОНЕЦ) + МАКСИМУМ(ВЫБОР е*2-ё КОГДА 1 ТОГДА "" ИНАЧЕ а КОНЕЦ) а ПОМЕСТИТЬ Таб ИЗ Шаг СГРУППИРОВАТЬ ПО е; УНИЧТОЖИТЬ Шаг;
ВЫБРАТЬ ВЫРАЗИТЬ(ё/2 КАК ЧИСЛО(15,0)) е, ё, а ПОМЕСТИТЬ Шаг ИЗ Таб; УНИЧТОЖИТЬ Таб;
ВЫБРАТЬ е ё, МАКСИМУМ(ВЫБОР е*2-ё КОГДА 1 ТОГДА а ИНАЧЕ "" КОНЕЦ) + МАКСИМУМ(ВЫБОР е*2-ё КОГДА 1 ТОГДА "" ИНАЧЕ а КОНЕЦ) а ПОМЕСТИТЬ Таб ИЗ Шаг СГРУППИРОВАТЬ ПО е; УНИЧТОЖИТЬ Шаг;
ВЫБРАТЬ ВЫРАЗИТЬ(ё/2 КАК ЧИСЛО(15,0)) е, ё, а ПОМЕСТИТЬ Шаг ИЗ Таб; УНИЧТОЖИТЬ Таб;
ВЫБРАТЬ е ё, МАКСИМУМ(ВЫБОР е*2-ё КОГДА 1 ТОГДА а ИНАЧЕ "" КОНЕЦ) + МАКСИМУМ(ВЫБОР е*2-ё КОГДА 1 ТОГДА "" ИНАЧЕ а КОНЕЦ) а ПОМЕСТИТЬ Таб ИЗ Шаг СГРУППИРОВАТЬ ПО е; УНИЧТОЖИТЬ Шаг;
ВЫБРАТЬ ВЫРАЗИТЬ(ё/2 КАК ЧИСЛО(15,0)) е, ё, а ПОМЕСТИТЬ Шаг ИЗ Таб; УНИЧТОЖИТЬ Таб;
ВЫБРАТЬ е ё, МАКСИМУМ(ВЫБОР е*2-ё КОГДА 1 ТОГДА а ИНАЧЕ "" КОНЕЦ) + МАКСИМУМ(ВЫБОР е*2-ё КОГДА 1 ТОГДА "" ИНАЧЕ а КОНЕЦ) а ПОМЕСТИТЬ Таб ИЗ Шаг СГРУППИРОВАТЬ ПО е; УНИЧТОЖИТЬ Шаг;
ВЫБРАТЬ ВЫРАЗИТЬ(ё/2 КАК ЧИСЛО(15,0)) е, ё, а ПОМЕСТИТЬ Шаг ИЗ Таб; УНИЧТОЖИТЬ Таб;
ВЫБРАТЬ е ё, МАКСИМУМ(ВЫБОР е*2-ё КОГДА 1 ТОГДА а ИНАЧЕ "" КОНЕЦ) + МАКСИМУМ(ВЫБОР е*2-ё КОГДА 1 ТОГДА "" ИНАЧЕ а КОНЕЦ) а ПОМЕСТИТЬ Таб ИЗ Шаг СГРУППИРОВАТЬ ПО е; УНИЧТОЖИТЬ Шаг;
ВЫБРАТЬ ВЫРАЗИТЬ(ё/2 КАК ЧИСЛО(15,0)) е, ё, а ПОМЕСТИТЬ Шаг ИЗ Таб; УНИЧТОЖИТЬ Таб;
ВЫБРАТЬ е ё, МАКСИМУМ(ВЫБОР е*2-ё КОГДА 1 ТОГДА а ИНАЧЕ "" КОНЕЦ) + МАКСИМУМ(ВЫБОР е*2-ё КОГДА 1 ТОГДА "" ИНАЧЕ а КОНЕЦ) а ПОМЕСТИТЬ Таб ИЗ Шаг СГРУППИРОВАТЬ ПО е; УНИЧТОЖИТЬ Шаг;
ВЫБРАТЬ ВЫРАЗИТЬ(ё/2 КАК ЧИСЛО(15,0)) е, ё, а ПОМЕСТИТЬ Шаг ИЗ Таб; УНИЧТОЖИТЬ Таб;
ВЫБРАТЬ е ё, МАКСИМУМ(ВЫБОР е*2-ё КОГДА 1 ТОГДА а ИНАЧЕ "" КОНЕЦ) + МАКСИМУМ(ВЫБОР е*2-ё КОГДА 1 ТОГДА "" ИНАЧЕ а КОНЕЦ) а ПОМЕСТИТЬ Таб ИЗ Шаг СГРУППИРОВАТЬ ПО е; УНИЧТОЖИТЬ Шаг;
ВЫБРАТЬ ВЫРАЗИТЬ(ё/2 КАК ЧИСЛО(15,0)) е, ё, а ПОМЕСТИТЬ Шаг ИЗ Таб; УНИЧТОЖИТЬ Таб;
ВЫБРАТЬ е ё, МАКСИМУМ(ВЫБОР е*2-ё КОГДА 1 ТОГДА а ИНАЧЕ "" КОНЕЦ) + МАКСИМУМ(ВЫБОР е*2-ё КОГДА 1 ТОГДА "" ИНАЧЕ а КОНЕЦ) а ПОМЕСТИТЬ Таб ИЗ Шаг СГРУППИРОВАТЬ ПО е; УНИЧТОЖИТЬ Шаг;
ВЫБРАТЬ ВЫРАЗИТЬ(ё/2 КАК ЧИСЛО(15,0)) е, ё, а ПОМЕСТИТЬ Шаг ИЗ Таб; УНИЧТОЖИТЬ Таб;
ВЫБРАТЬ е ё, МАКСИМУМ(ВЫБОР е*2-ё КОГДА 1 ТОГДА а ИНАЧЕ "" КОНЕЦ) + МАКСИМУМ(ВЫБОР е*2-ё КОГДА 1 ТОГДА "" ИНАЧЕ а КОНЕЦ) а ПОМЕСТИТЬ Таб ИЗ Шаг СГРУППИРОВАТЬ ПО е; УНИЧТОЖИТЬ Шаг;
ВЫБРАТЬ а ИЗ Таб
Показать
Его можно запускать в консоли, в которой можно задавать параметры-таблицы значений. Ему нужен параметр с именем "Дано", содержащий одну колонку "КОЛОНКА". Кроме того, приведена обработка, в которую встроен тот же запрос. Требуемый режим включается галочкой "по алфавиту". Если галочка не включена, строки соединяются в порядке номеров строк их записи. Скриншот формы обработки также прилагается.
Прикрепленные файлы:
АгрегатнаяКонкатенацияЛайт.erf
ixijixi; Михаська; m-serg74; andrewks; +4 Ответить
85. andrewks 1370 07.09.13 10:06 Сейчас в теме
(84) ildarovich, впечатляюще.

начал разбирать.
ВЫБРАТЬ НомерСтроки, ё, ПОДСТРОКА(а, ё, 1) а ПОМЕСТИТЬ Буквы ИЗ Дано, РА9876543210;
ВЫБРАТЬ НомерСтроки, МАКСИМУМ(ё) СтрДлина ПОМЕСТИТЬ Длины ИЗ Буквы ГДЕ а > "" СГРУППИРОВАТЬ ПО НомерСтроки;
ВЫБРАТЬ Буквы.НомерСтроки, ё,ВЫБОР а КОГДА " " ТОГДА " " ИНАЧЕ а КОНЕЦ а ПОМЕСТИТЬ СокрП ИЗ Буквы СОЕДИНЕНИЕ Длины ПО Буквы.НомерСтроки = Длины.НомерСтроки И ё <= СтрДлина;



можно упростить до

ВЫБРАТЬ НомерСтроки, ё, ПОДСТРОКА(а, ё, 1) а ПОМЕСТИТЬ Буквы ИЗ Дано, РА9876543210 ГДЕ (ПОДСТРОКА(а, ё, 1) > "");
97. ildarovich 7861 08.09.13 11:25 Сейчас в теме
(85) Я планирую переписать начало запроса, то там не все так просто.
(93) Да, я на днях перепишу начало запроса, избавлюсь от аСокрП и этого эффекта не будет.
(96) Думаю, это от того, что Вы использовали свой вариант начала запроса, а не мой. В моем варианте этого артефакта нет.
Прикрепленные файлы:
98. andrewks 1370 08.09.13 11:56 Сейчас в теме
(97) ildarovich, нет, артефакт именно с оригинальным вариантом, только строки задаём не параметром, а прямо в запросе. скопируйте, и выполните в консоли

ВЫБРАТЬ "строка1" Колонка
ПОМЕСТИТЬ ДаноПарам
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "строка2"
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "строка3"
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "строка4 строка5 строка6 строка7 строка8 строка9 строка10 строка11 строка12 строка13 строка14 строка15 строка16 строка17 строка18 строка19 строка20"

;

ВЫБРАТЬ РАЗЛИЧНЫЕ Дано.Колонка НомерСтроки, Дано.Колонка а ПОМЕСТИТЬ Дано ИЗ ДаноПарам КАК Дано;
ВЫБРАТЬ 0 ё ПОМЕСТИТЬ Р0 ОБЪЕДИНИТЬ ВЫБРАТЬ 1;
ВЫБРАТЬ 2 * Р1.ё + Р0.ё ё ПОМЕСТИТЬ Р10 ИЗ Р0 Р1, Р0;
ВЫБРАТЬ 4 * Р32.ё + Р10.ё ё ПОМЕСТИТЬ Р3210 ИЗ Р10 Р32, Р10;
ВЫБРАТЬ 16 * Р7654.ё + Р3210.ё ё ПОМЕСТИТЬ Р76543210 ИЗ Р3210 Р7654, Р3210;
ВЫБРАТЬ 8 * Р76543210.ё + 2 * Р10.ё + Р0.ё + 1 ё ПОМЕСТИТЬ РА9876543210 ИЗ Р76543210, Р10, Р0;
ВЫБРАТЬ НомерСтроки, ё, ПОДСТРОКА(а, ё, 1) а ПОМЕСТИТЬ Буквы ИЗ Дано, РА9876543210;
ВЫБРАТЬ НомерСтроки, МАКСИМУМ(ё) СтрДлина ПОМЕСТИТЬ Длины ИЗ Буквы ГДЕ а > "" СГРУППИРОВАТЬ ПО НомерСтроки;
ВЫБРАТЬ Буквы.НомерСтроки, ё,ВЫБОР а КОГДА " " ТОГДА " " ИНАЧЕ а КОНЕЦ а ПОМЕСТИТЬ СокрП ИЗ Буквы СОЕДИНЕНИЕ Длины ПО Буквы.НомерСтроки = Длины.НомерСтроки И ё <= СтрДлина;
ВЫБРАТЬ ё + СУММА(ЕСТЬNULL(СтрДлина, 0)) ё, а Поместить Таб ИЗ СокрП КАК Буквы ЛЕВОЕ СОЕДИНЕНИЕ Длины ПО Буквы.НомерСтроки > Длины.НомерСтроки СГРУППИРОВАТЬ ПО Буквы.НомерСтроки, ё, а;
ВЫБРАТЬ ВЫРАЗИТЬ(ё/2 КАК ЧИСЛО(15,0)) е, ё, а ПОМЕСТИТЬ Шаг ИЗ Таб; УНИЧТОЖИТЬ Таб;
ВЫБРАТЬ е ё, МАКСИМУМ(ВЫБОР е*2-ё КОГДА 1 ТОГДА а ИНАЧЕ "" КОНЕЦ) + МАКСИМУМ(ВЫБОР е*2-ё КОГДА 1 ТОГДА "" ИНАЧЕ а КОНЕЦ) а ПОМЕСТИТЬ Таб ИЗ Шаг СГРУППИРОВАТЬ ПО е; УНИЧТОЖИТЬ Шаг;
ВЫБРАТЬ ВЫРАЗИТЬ(ё/2 КАК ЧИСЛО(15,0)) е, ё, а ПОМЕСТИТЬ Шаг ИЗ Таб; УНИЧТОЖИТЬ Таб;
ВЫБРАТЬ е ё, МАКСИМУМ(ВЫБОР е*2-ё КОГДА 1 ТОГДА а ИНАЧЕ "" КОНЕЦ) + МАКСИМУМ(ВЫБОР е*2-ё КОГДА 1 ТОГДА "" ИНАЧЕ а КОНЕЦ) а ПОМЕСТИТЬ Таб ИЗ Шаг СГРУППИРОВАТЬ ПО е; УНИЧТОЖИТЬ Шаг;
ВЫБРАТЬ ВЫРАЗИТЬ(ё/2 КАК ЧИСЛО(15,0)) е, ё, а ПОМЕСТИТЬ Шаг ИЗ Таб; УНИЧТОЖИТЬ Таб;
ВЫБРАТЬ е ё, МАКСИМУМ(ВЫБОР е*2-ё КОГДА 1 ТОГДА а ИНАЧЕ "" КОНЕЦ) + МАКСИМУМ(ВЫБОР е*2-ё КОГДА 1 ТОГДА "" ИНАЧЕ а КОНЕЦ) а ПОМЕСТИТЬ Таб ИЗ Шаг СГРУППИРОВАТЬ ПО е; УНИЧТОЖИТЬ Шаг;
ВЫБРАТЬ ВЫРАЗИТЬ(ё/2 КАК ЧИСЛО(15,0)) е, ё, а ПОМЕСТИТЬ Шаг ИЗ Таб; УНИЧТОЖИТЬ Таб;
ВЫБРАТЬ е ё, МАКСИМУМ(ВЫБОР е*2-ё КОГДА 1 ТОГДА а ИНАЧЕ "" КОНЕЦ) + МАКСИМУМ(ВЫБОР е*2-ё КОГДА 1 ТОГДА "" ИНАЧЕ а КОНЕЦ) а ПОМЕСТИТЬ Таб ИЗ Шаг СГРУППИРОВАТЬ ПО е; УНИЧТОЖИТЬ Шаг;
ВЫБРАТЬ ВЫРАЗИТЬ(ё/2 КАК ЧИСЛО(15,0)) е, ё, а ПОМЕСТИТЬ Шаг ИЗ Таб; УНИЧТОЖИТЬ Таб;
ВЫБРАТЬ е ё, МАКСИМУМ(ВЫБОР е*2-ё КОГДА 1 ТОГДА а ИНАЧЕ "" КОНЕЦ) + МАКСИМУМ(ВЫБОР е*2-ё КОГДА 1 ТОГДА "" ИНАЧЕ а КОНЕЦ) а ПОМЕСТИТЬ Таб ИЗ Шаг СГРУППИРОВАТЬ ПО е; УНИЧТОЖИТЬ Шаг;
ВЫБРАТЬ ВЫРАЗИТЬ(ё/2 КАК ЧИСЛО(15,0)) е, ё, а ПОМЕСТИТЬ Шаг ИЗ Таб; УНИЧТОЖИТЬ Таб;
ВЫБРАТЬ е ё, МАКСИМУМ(ВЫБОР е*2-ё КОГДА 1 ТОГДА а ИНАЧЕ "" КОНЕЦ) + МАКСИМУМ(ВЫБОР е*2-ё КОГДА 1 ТОГДА "" ИНАЧЕ а КОНЕЦ) а ПОМЕСТИТЬ Таб ИЗ Шаг СГРУППИРОВАТЬ ПО е; УНИЧТОЖИТЬ Шаг;
ВЫБРАТЬ ВЫРАЗИТЬ(ё/2 КАК ЧИСЛО(15,0)) е, ё, а ПОМЕСТИТЬ Шаг ИЗ Таб; УНИЧТОЖИТЬ Таб;
ВЫБРАТЬ е ё, МАКСИМУМ(ВЫБОР е*2-ё КОГДА 1 ТОГДА а ИНАЧЕ "" КОНЕЦ) + МАКСИМУМ(ВЫБОР е*2-ё КОГДА 1 ТОГДА "" ИНАЧЕ а КОНЕЦ) а ПОМЕСТИТЬ Таб ИЗ Шаг СГРУППИРОВАТЬ ПО е; УНИЧТОЖИТЬ Шаг;
ВЫБРАТЬ ВЫРАЗИТЬ(ё/2 КАК ЧИСЛО(15,0)) е, ё, а ПОМЕСТИТЬ Шаг ИЗ Таб; УНИЧТОЖИТЬ Таб;
ВЫБРАТЬ е ё, МАКСИМУМ(ВЫБОР е*2-ё КОГДА 1 ТОГДА а ИНАЧЕ "" КОНЕЦ) + МАКСИМУМ(ВЫБОР е*2-ё КОГДА 1 ТОГДА "" ИНАЧЕ а КОНЕЦ) а ПОМЕСТИТЬ Таб ИЗ Шаг СГРУППИРОВАТЬ ПО е; УНИЧТОЖИТЬ Шаг;
ВЫБРАТЬ ВЫРАЗИТЬ(ё/2 КАК ЧИСЛО(15,0)) е, ё, а ПОМЕСТИТЬ Шаг ИЗ Таб; УНИЧТОЖИТЬ Таб;
ВЫБРАТЬ е ё, МАКСИМУМ(ВЫБОР е*2-ё КОГДА 1 ТОГДА а ИНАЧЕ "" КОНЕЦ) + МАКСИМУМ(ВЫБОР е*2-ё КОГДА 1 ТОГДА "" ИНАЧЕ а КОНЕЦ) а ПОМЕСТИТЬ Таб ИЗ Шаг СГРУППИРОВАТЬ ПО е; УНИЧТОЖИТЬ Шаг;
ВЫБРАТЬ ВЫРАЗИТЬ(ё/2 КАК ЧИСЛО(15,0)) е, ё, а ПОМЕСТИТЬ Шаг ИЗ Таб; УНИЧТОЖИТЬ Таб;
ВЫБРАТЬ е ё, МАКСИМУМ(ВЫБОР е*2-ё КОГДА 1 ТОГДА а ИНАЧЕ "" КОНЕЦ) + МАКСИМУМ(ВЫБОР е*2-ё КОГДА 1 ТОГДА "" ИНАЧЕ а КОНЕЦ) а ПОМЕСТИТЬ Таб ИЗ Шаг СГРУППИРОВАТЬ ПО е; УНИЧТОЖИТЬ Шаг;
ВЫБРАТЬ ВЫРАЗИТЬ(ё/2 КАК ЧИСЛО(15,0)) е, ё, а ПОМЕСТИТЬ Шаг ИЗ Таб; УНИЧТОЖИТЬ Таб;
ВЫБРАТЬ е ё, МАКСИМУМ(ВЫБОР е*2-ё КОГДА 1 ТОГДА а ИНАЧЕ "" КОНЕЦ) + МАКСИМУМ(ВЫБОР е*2-ё КОГДА 1 ТОГДА "" ИНАЧЕ а КОНЕЦ) а ПОМЕСТИТЬ Таб ИЗ Шаг СГРУППИРОВАТЬ ПО е; УНИЧТОЖИТЬ Шаг;
ВЫБРАТЬ а ИЗ Таб
Показать
88. m-serg74 46 07.09.13 11:23 Сейчас в теме
91. echo77 1881 07.09.13 13:11 Сейчас в теме
Кто-нибудь может рассказать что это (84)? И как это работает?
92. andrewks 1370 07.09.13 13:44 Сейчас в теме
(91) echo77,
1. порождающим запросом выстраивается посл-ть чисел от 1 до 2048 (это - допущение для макс.длины строк)
2. для каждой строки вычисляется индекс (позиция) буквы в этой строке
3. для каждой строки вычисляется длина
4. для каждой буквы вычисляется позиция в будущей результативной строке (конкатенации), путём прибавления суммы длин строк, лежащих "выше"

а дальше идёт колдовство
102. ildarovich 7861 09.09.13 16:48 Сейчас в теме
(91)(92)(93) Решил все же опубликовать статью с описанием изложенного подхода. Она называется "Агрегатное суммирование строк в запросе - сложно, но не невозможно". Статья расположена по адресу http://infostart.ru/public/200275/ (сейчас статья проходит модерацию). В статье подробно расписаны обоснование и все нюансы метода. В запросе, приведенном в статье, переписано начало и правые пробелы в соединяемых строках теперь не проглатываются.
Кстати, в статье поясняется и фокус с неразрывным пробелом и обосновывается число 2048. Это не допущение метода, а реальное ограничение на длину "ограниченных" строк, с которыми только и можно оперировать в запросе.
93. Новиков 292 07.09.13 13:56 Сейчас в теме
(84) wow-эффект, однозначно ;)

Потратив некоторое количество времени для адаптации в консоли увидел одну особенность на скрине ниже. Хотелось бы узнать у автора, можно ли ее в решении учесть?
Прикрепленные файлы:
86. andrewks 1370 07.09.13 10:22 Сейчас в теме
вот так:

ВЫБРАТЬ НомерСтроки, ё, ПОДСТРОКА(а, ё, 1) а ПОМЕСТИТЬ Буквы ИЗ Дано, РА9876543210 ГДЕ (ПОДСТРОКА(а, ё, 1) > "");
ВЫБРАТЬ НомерСтроки, МАКСИМУМ(ё) СтрДлина ПОМЕСТИТЬ Длины ИЗ Буквы СГРУППИРОВАТЬ ПО НомерСтроки;
ВЫБРАТЬ ё + СУММА(ЕСТЬNULL(СтрДлина, 0)) ё, а  ИЗ Буквы КАК Буквы ЛЕВОЕ СОЕДИНЕНИЕ Длины ПО Буквы.НомерСтроки > Длины.НомерСтроки СГРУППИРОВАТЬ ПО Буквы.НомерСтроки, ё, а;



должно сэкономить память и время при выполнении
87. AnryMc 849 07.09.13 10:35 Сейчас в теме
А ноги, футбол - двадцать два бугая один мяч перекатывают! А вы выдайте каждому ну это... каток! Так они, 22 бугая, 22 бугая, да на полтора часа.... да на полтора часа и на 22 бугая... два пишем, семь на ум пошло........... они все поле заасфальтируют! А еще зрители по рублю дадут, сто тысяч зрителей по одному рублю - это будет.... сто тысяч да по одному рублю... это будет..... да просто сумасшедшие деньги!


(с) Аркадий Райкин
89. Sabfir 07.09.13 11:27 Сейчас в теме
Очень интересная тема. Ждем результат решения
90. m-serg74 46 07.09.13 11:32 Сейчас в теме
(89) Sabfir, какой результат? он в (84) уже есть
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот