|
Свернуть наборы в таблице | ☑ | ||
---|---|---|---|---|
0
Прохожий
25.01.23
✎
13:25
|
Есть таблица из двух колонок:
Класс Имя 1 Вера 1 Саша 1 Дима 1 Петя 2 Оля 3 Олег 3 Наташа 4 Вова Надо получить Класс Имя1 Имя2 Имя3 Имя4 1 Вера Дима Саша Петя 2 Оля 3 Олег Наташа 4 Вова Последовательность имен не важна. Какой алгоритм лучший? |
|||
1
АгентБезопасной Нацио
25.01.23
✎
13:26
|
а в чем критерий "лучшести"?
|
|||
2
Прохожий
25.01.23
✎
13:28
|
В первую таблицу (исходную) добавил АВТОНОМЕРЗАПИСИ() и вложенными запросами по Класс соединял при условии что номера записей разные. Но много некрасивых условий в запросе и чем больше народу тем масштабнее...
(1) Желательно универсально написать в одном запросе. Предположим что не более 4х детей. Из исходной таблицы получить ВТ_ДетиВКлассах. |
|||
3
KJlag
25.01.23
✎
13:29
|
если таблица большая, классы не факт что все есть, то в запихнуть в запрос и сгруппировать?
|
|||
4
Прохожий
25.01.23
✎
13:29
|
Лучше чем шашлык из вложенных запросов есть идеи?
|
|||
5
Прохожий
25.01.23
✎
13:30
|
(3) Как ты себе представляешь группирование в одну строку?
|
|||
6
KJlag
25.01.23
✎
13:36
|
(5) в запросе сгруппировать, а дальше по выводу пройтись разок и раскидать в том формате, что нам надо.
в моем понимании, самая большая трабла по времени это когда мы стоим на строке N, и найти среди тысяч уже отработанных классов был такой или нет. |
|||
7
Прохожий
25.01.23
✎
13:39
|
(6) Куда пройтись? Надо в запросе получить временную таблицу.... Семерошник?
|
|||
8
KJlag
25.01.23
✎
13:40
|
ну или если мы знаем, что класс - это точно цифра, то строить бинарное дерево.
слева = ветка цифер меньше текущего нода, справа - больше. |
|||
9
Прохожий
25.01.23
✎
13:54
|
Нет, но возникла суперидея...
|
|||
10
bolobol
25.01.23
✎
14:00
|
Сортировать, Добавить колонку 1, Свернуть копию по классу суммируя по 1 - получим количество имён, Создать недостающее количество колонок, Заполнить в один проход с удалением строк с перемещёнными именами
|
|||
11
Прохожий
25.01.23
✎
14:05
|
(10) В какой проход? Парижской... Бога матери.
|
|||
12
АгентБезопасной Нацио
25.01.23
✎
14:15
|
ВЫБРАТЬ
1 КАК Класс, "Вера" КАК Имя ПОМЕСТИТЬ ВТ_Ученики ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 1, "Саша" ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 1, "Дима" ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 1, "Петя" ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 2, "Оля" ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 3, "Олег" ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 3, "Наташа" ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 4, "Вова" ; Выбрать Класс, АвтоНомерЗаписи() КАК НомерЗаписи, Имя ПОМЕСТИТЬ ВТ_Нумерованная ИЗ ВТ_Ученики ; Выбрать Класс,Минимум(НомерЗаписи) Как МинНомерЗаписи ПОМЕСТИТЬ ВТ_Смещение ИЗ ВТ_Нумерованная СГРУППИРОВАТЬ ПО Класс ; ВЫБРАТЬ Нумерованная.Класс, (Нумерованная.НомерЗаписи-Смещение.МинНомерЗаписи) КАК НомерПоля, Нумерованная.Имя ПОМЕСТИТЬ ВТ_ПромИтог ИЗ ВТ_Нумерованная КАК Нумерованная ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Смещение КАК Смещение ПО Смещение.Класс=Нумерованная.Класс ; Выбрать Класс, ВЫБОР КОГДА НомерПоля=0 ТОГДА Имя иначе "" КОНЕЦ КАК ИМЯ1, ВЫБОР КОГДА НомерПоля=1 ТОГДА Имя иначе "" КОНЕЦ КАК ИМЯ2, ВЫБОР КОГДА НомерПоля=2 ТОГДА Имя иначе "" КОНЕЦ КАК ИМЯ3, ВЫБОР КОГДА НомерПоля=3 ТОГДА Имя иначе "" КОНЕЦ КАК ИМЯ4 ПОМЕСТИТЬ ВТ_Итог ИЗ ВТ_промитог ; Выбрать Класс, Максимум(Имя1) КАК ИМЯ1, Максимум(Имя2) КАК ИМЯ2, Максимум(Имя3) КАК ИМЯ3, Максимум(Имя4) КАК ИМЯ4 ИЗ ВТ_Итог СГРУППИРОВАТЬ ПО Класс |
|||
13
Прохожий
25.01.23
✎
14:15
|
ВЫБРАТЬ
ВТ_ИсходнаяТаблица.Класс КАК Класс, ВТ_ИсходнаяТаблица.Имя КАК Имя, АВТОНОМЕРЗАПИСИ() КАК СтрокаВыборки ПОМЕСТИТЬ ВТ_ПервыйУровень ИЗ &ИсходнаяТаблица КАК ВТ_ИсходнаяТаблица ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТ_ИсходнаяТаблица.Класс КАК Класс, МИНИМУМ(ВТ_ИсходнаяТаблица.СтрокаВыборки) КАК СтрокаВыборки1 ПОМЕСТИТЬ ВТ_ПервыйУровень ИЗ ВТ_ИсходнаяТаблица КАК ВТ_ИсходнаяТаблица СГРУППИРОВАТЬ ПО ВТ_ИсходнаяТаблица.Класс ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТ_ИсходнаяТаблица.Класс КАК Класс, МИНИМУМ(ВТ_ИсходнаяТаблица.СтрокаВыборки) КАК СтрокаВыборки2 ПОМЕСТИТЬ ВТ_ВторойУровень ИЗ ВТ_ИсходнаяТаблица КАК ВТ_ИсходнаяТаблица ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ПервыйУровень КАК ВТ_ПервыйУровень ПО ВТ_ИсходнаяТаблица.СтрокаВыборки = ВТ_ПервыйУровень.СтрокаВыборки1 ГДЕ ВТ_ПервыйУровень.СтрокаВыборки1 ЕСТЬ NULL СГРУППИРОВАТЬ ПО ВТ_ИсходнаяТаблица.Класс ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТ_ИсходнаяТаблица.Класс КАК Класс, МИНИМУМ(ВТ_ИсходнаяТаблица.СтрокаВыборки) КАК СтрокаВыборки3 ПОМЕСТИТЬ ВТ_ТретийУровень ИЗ ВТ_ИсходнаяТаблица КАК ВТ_ИсходнаяТаблица ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ Т.СтрокаВыборки1 КАК СтрокаВыборки ИЗ ВТ_ПервыйУровень КАК Т ОБЪЕДИНИТЬ ВЫБРАТЬ Т.СтрокаВыборки2 ИЗ ВТ_ВторойУровень КАК Т) КАК ПервыйИВторойУровень ПО ВТ_ИсходнаяТаблица.СтрокаВыборки = ПервыйИВторойУровень.СтрокаВыборки ГДЕ ПервыйИВторойУровень.СтрокаВыборки ЕСТЬ NULL СГРУППИРОВАТЬ ПО ВТ_ИсходнаяТаблица.Класс ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТ_ИсходнаяТаблица.Класс КАК Класс, МИНИМУМ(ВТ_ИсходнаяТаблица.СтрокаВыборки) КАК СтрокаВыборки4 ПОМЕСТИТЬ ВТ_ЧетвертыйУровень ИЗ ВТ_ИсходнаяТаблица КАК ВТ_ИсходнаяТаблица ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ Т.СтрокаВыборки1 КАК СтрокаВыборки ИЗ ВТ_ПервыйУровень КАК Т ОБЪЕДИНИТЬ ВЫБРАТЬ Т.СтрокаВыборки2 ИЗ ВТ_ВторойУровень КАК Т ОБЪЕДИНИТЬ ВЫБРАТЬ Т.СтрокаВыборки3 ИЗ ВТ_ТретийУровень КАК Т) КАК ПервыйИВторойИТретийУровень ПО ВТ_ИсходнаяТаблица.СтрокаВыборки = ПервыйИВторойИТретийУровень.СтрокаВыборки ГДЕ ПервыйИВторойИТретийУровень.СтрокаВыборки ЕСТЬ NULL СГРУППИРОВАТЬ ПО ВТ_ИсходнаяТаблица.Класс |
|||
14
АгентБезопасной Нацио
25.01.23
✎
14:16
|
(11) так пойдет?
(13) Не слишком ли сложно? |
|||
15
Прохожий
25.01.23
✎
14:17
|
(12) Интересно. Молодец. Нормально.
|
|||
16
АгентБезопасной Нацио
25.01.23
✎
14:18
|
(15) вроде как примитивно
Но как в 1с записать в поле, зная только номер - не знаю, не смог. в клюшках по идее можно было |
|||
17
АгентБезопасной Нацио
25.01.23
✎
14:19
|
вот кто б с источниками для бюджетирования помог...
|
|||
18
bolobol
25.01.23
✎
14:20
|
И всё это работает ровно до тех пор, пока не появится Иииииигорь!"
|
|||
19
АгентБезопасной Нацио
25.01.23
✎
14:20
|
(18) ?
|
|||
20
bolobol
25.01.23
✎
14:24
|
Мдя.. глядя на то что приходится переделывать, даже не доделывать, а именно переделывать - чувствуются руки мастера, который хотел нагреть заказчика на новую разработку из-за того что в одном классе стало больше детей, чем было на момент первой разработки
|
|||
21
Ryzeman
25.01.23
✎
14:24
|
(19) Имя5
(0) транспонировать в 1с функцией вроде нельзя до сих пор. По сути тебе надо транспонировать таблицу и соединить саму с собой. Самый простой способ решить такую задачу - это декартово и ВЫБРАТЬ, потом свернуть. НО опять же (18), да и на большом объёме данных, очевидно, может всю оперативу сожрать |
|||
22
bolobol
25.01.23
✎
14:25
|
Поэтому - (10)
|
|||
23
bolobol
25.01.23
✎
14:27
|
Но можно, наверное, заставить СКД сделать таблицу и выгрузить результат в ТЗ...
|
|||
24
Ryzeman
25.01.23
✎
14:27
|
(22) А если задача сделать это именно в запросе? Хотя, я слабо представляю задачу 1с где ты ограничен только запросом
|
|||
25
bolobol
25.01.23
✎
14:29
|
В запросе необходимо описать колонки, а их- неизвестное количество до выполнения запроса.
|
|||
26
Kassern
25.01.23
✎
14:34
|
(23) Конечно можно, ничего сложного в этом нет.
|
|||
27
hockeyist
25.01.23
✎
14:35
|
(12) Кстати, ChatGPT как раз это решение и выдает
|
|||
28
АгентБезопасной Нацио
25.01.23
✎
14:36
|
(25) ну, во-первых, в (2) было ограничение на количество.
во-вторых, условие "запросом" в третьих, этот кусок запроса с наименованиями полей можно формировать динамически, или сделать его достаточно большим а в пакете возвращать /контролировать количество. Это легко |
|||
29
АгентБезопасной Нацио
25.01.23
✎
14:37
|
(27) не пользовался. Даже конструктором не пользовался
|
|||
30
hockeyist
25.01.23
✎
14:41
|
||||
31
hockeyist
25.01.23
✎
14:42
|
||||
32
Прохожий
25.01.23
✎
16:30
|
(20) Подогрели, обобрали... фу, подобрали-обогрели
|
|||
33
Прохожий
25.01.23
✎
16:33
|
(30, 31) На казахский это не переводится. Кончай по-польски материться.
|
|||
34
АгентБезопасной Нацио
25.01.23
✎
16:36
|
(33) ну там то же самое, только с оконными функциями. в 1с их нет.
|
|||
35
hockeyist
25.01.23
✎
16:54
|
(34) В данном случае АвтоНомерЗаписи() это и есть оконная функция по рабоче-крестьянски
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |