Имя: Пароль:
1C
1С v8
Как получить все комбинации значений в запросе
0 r152
 
31.08.15
08:45
Вопрос для СУПЕРМОЗГА по запросам. Сама задача более глубокая. Но нужно сначала разобраться с этим куском.
Нужно получить все комбинации значений в запросе, таким образом:

имеем таблицу:
1 - Леша
2 - Женя
3 - Антон

Надо получить:
1 - Леша
2 - Женя
3 - Леша, Женя
4 - Антон
5 - Антон, Леша
6 - Антон, Женя
7 - Антон, Женя, Леша

то есть там где по 2,3 значения
3 - Леша
3 - Женя
5 - Антон
5 - Леша
и т.д.

Порядок не имеет значения.

Сам разобрался, смог получить, но только с добавлением в исходную таблицу ранее рассчитанной колонки. но как без неё, или как её рассчитать в запросе???
Эксперты отзовитесь!!!
1 el-gamberro
 
31.08.15
08:50
А в чем проблема? Делай CROSS JOIN. Их число должно быть равно количеству имен в таблице.

Вот тебе запрос:
Если тзТаблицаИмен = 3 Тогда
Запрос.Текст = "ВЫБРАТЬ * Из ТаблицаИмен, ТаблицаИмен, ТаблицаИмен"
2 Брегорьян
 
31.08.15
08:52
(0) сколько полей хочешь получить в результате?
3 r152
 
31.08.15
08:53
Имен не 3, а множество.
И запрос нужен в 1с-овский
4 Лодырь
 
31.08.15
08:53
(1) Плюс удалить совпадающие значения, плюс как то слепить их в одну строку.
5 Trotter
 
31.08.15
08:57
Ничё не понял, предложу "ВЫБРАТЬ РАЗЛИЧНЫЕ"   :)
6 r152
 
31.08.15
08:57
(2)  если  3 имени то комбинаций = 7, а строк результата = 12: вот так:

1 - Леша
2 - Женя
3 - Леша
3 - Женя
4 - Антон
5 - Антон
5 - Леша
6 - Антон
6 - Женя
7 - Антон
7 - Женя
7 - Леша

соответственно,  если  4 - имени то: комбинаций = 15 , а строк = 32
7 r152
 
31.08.15
08:59
(4) слеплять в одну строку не нужно, нужно если несколько значений - то определить их одной строке
8 r152
 
31.08.15
09:01
Мож кто уже догодался какую колонку нужно добавить чтоб сие получить?
9 Лодырь
 
31.08.15
09:02
(8) Вы так уверены, что ваше решение оптимально?
10 Брегорьян
 
31.08.15
09:08
одно из двух: или автор не понимает, чего хочет, или не умеет сказать это человеческим языком
11 r152
 
31.08.15
09:09
Не уверен, по этому и спрашиваю тут.
Прежде чем сюда писать, копался в нэте 2 дня.
ниче подобного не нашел. сам допер как получить - но сдобавлением колонки (((. ща состряпаю запрос - выложу...
12 r152
 
31.08.15
09:15
(10) или не умеют понимать
13 Брегорьян
 
31.08.15
09:16
(12) не все умеют понимать два разных желаемых результата
14 gigi789
 
31.08.15
09:18
(0) а автор в курсе что результат Леша, Женя и  Женя, Леша  Это разные результаты??
15 VladZ
 
31.08.15
09:19
(0) Все гениальное - просто! Как следствие, если задача слишком усложняется, значит где-то "свернули не туда".
16 gigi789
 
31.08.15
09:21
(14)  Антон, Женя, Леша. Это ваще круто А если их таем пять сот должно в выходной таблице быть пятьсот столбцов
17 gigi789
 
31.08.15
09:21
(16) Если да то нужно запрос генерировать динамически
18 gigi789
 
31.08.15
09:22
(17) и на 1с этот запрос будет очень долгим автор успеет чаю об питься.
19 r152
 
31.08.15
09:22
(16) не нужно столбцы
20 r152
 
31.08.15
09:23
пример по проще...
21 gigi789
 
31.08.15
09:23
(19) А что нужно Декартово произведение одного множества на другое??
22 gigi789
 
31.08.15
09:25
(21) Так это соединение двух множеств по истина
23 r152
 
31.08.15
09:26
есть табл: (2 колонки)
НомерПП   |  Значение
---------------------
  1            Леша
  2            Женя

Нужно: (2 колонки)

КомбинацияНомер | Значение
   1               Леша
   2               Женя
   3               Леша
   3               Женя

тоесть комбинация номер 3 включает двестроки
24 gigi789
 
31.08.15
09:26
(23) ответ в (22)
25 r152
 
31.08.15
09:27
(22) только не двух множеств, а множеств множеств... )))
26 r152
 
31.08.15
09:27
(25) И как же получить???
27 r152
 
31.08.15
09:28
Задача интересна тем что она реально нужна для реального отчета ))
28 gigi789
 
31.08.15
09:29
(26) ВЫБРАТЬ
    "Женя" КАК Поле1,
    "Леша" КАК Поле2
ПОМЕСТИТЬ врт
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    врт.Поле1
ИЗ
    врт КАК врт
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ врт КАК врт1
        ПО (ИСТИНА)
29 el7cartel
 
31.08.15
09:30
(0) даже не парился бы, если это тяжело сделать в запросе! сначала бы ручками в цикле перебрал бы все варианты в тз, а затем если это нужно уже передал бы в запрос.
30 r152
 
31.08.15
09:31
чето не то
31 Лодырь
 
31.08.15
09:31
Можно либо сгенерить пакетный запрос программно, либо сделать запрос в цикле. Однако на 30 элементах это "щастье" будет работать хорошо если день )
32 r152
 
31.08.15
09:32
(29)  это да.  но запрос будет выполняться быстрее.
а может быть все-же есть решение (((
33 el7cartel
 
31.08.15
09:33
(32) ты уверен, что запрос будет быстрей выполняться?
34 gigi789
 
31.08.15
09:33
(28) ВЫБРАТЬ
    "Женя" КАК Поле1
ПОМЕСТИТЬ врт

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "Леша"
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    врт.Поле1
ИЗ
    врт КАК врт
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ врт КАК врт1
        ПО (ИСТИНА)
35 gigi789
 
31.08.15
09:34
Ошибся Куда данные заносил))
36 r152
 
31.08.15
09:34
(31) Можно без этого.
вот только если-бы было можно в 1сных запросах возводить в степень
37 r152
 
31.08.15
09:35
(34)  все гораздо сложнее )))
38 Лодырь
 
31.08.15
09:36
(36) Может быть и можно, но проблему с быстродействием на более менее больших объемах это не решит. Сколько вообще планируется элементов которые надо комбинировать? хотя б примерно?
39 patapum
 
31.08.15
09:38
(37) Поместить во временную таблицу ВТИмя (Номер, Имя):
1. "Женя"
2. "Леша"
3. "Петя"
4. ""

ВЫБРАТЬ
ВТИмя1.Имя КАК Имя1,
ВТИмя2.Имя КАК Имя2,
ВТИмя3.Имя КАК Имя3
ИЗ ВТИмя КАК Имя1
ПОЛНОЕ СОЕДИНЕНИЕ ВТИмя2 ПО ВТИмя2.Номер > ВТИмя1.Номер ИЛИ ВТИмя2.Имя = ""
ПОЛНОЕ СОЕДИНЕНИЕ ВТИмя3 ПО ВТИмя3.Номер > ВТИмя2.Номер ИЛИ ВТИмя3.Имя = ""
40 gigi789
 
31.08.15
09:38
(37) а что не так то??
41 r152
 
31.08.15
09:39
до 50 шт.
42 patapum
 
31.08.15
09:39
(39)
Вместо
ПОЛНОЕ СОЕДИНЕНИЕ ВТИмя2 или 3 нужно
ПОЛНОЕ СОЕДИНЕНИЕ ВТИмя КАК ВТИмя2 или 3
43 Лодырь
 
31.08.15
09:40
(41) Забей на задачу. Не делай. Почему? Просто посчитай ради интереса количество комбинаций.
44 Лодырь
 
31.08.15
09:46
1 - 1
2 - 3
3 - 7
4 - 15
N - 2^N-1
И это только комбинаций.
На 50 элементов ты будешь иметь
1,1258999 ? 10^15 комбинаций

Ты уверен в своих желаниях?
45 r152
 
31.08.15
09:47
(43) это да уже считал. хотя мож и меньше. для 20 ещё сойдет
46 r152
 
31.08.15
09:47
ВЫБРАТЬ
    1 КАК НоменПП,
    "Леша" КАК ИмяЧела,
    2 КАК ДобавленаяКолонка
ПОМЕСТИТЬ ИсходнаяТабл

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    2,
    "Женя",
    4

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    3,
    "Антон",
    8
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    0 КАК Поле1
ПОМЕСТИТЬ Числа

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    1

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    2

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    3

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    4

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    5

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    6

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    7

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    8

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    9
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Числа2.Поле1 + Числа1.Поле1 * 10 + Числа.Поле1 * 100 КАК Число
ПОМЕСТИТЬ ЧислаДо1000
ИЗ
    Числа КАК Числа,
    Числа КАК Числа1,
    Числа КАК Числа2
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    МАКСИМУМ(ИсходнаяТабл.ДобавленаяКолонка) КАК КолвоКомб
ПОМЕСТИТЬ КоличествоКомбинаций
ИЗ
    ИсходнаяТабл КАК ИсходнаяТабл
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ЧислаДо1000.Число
ПОМЕСТИТЬ ВсеНомераКомб
ИЗ
    ЧислаДо1000 КАК ЧислаДо1000
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ КоличествоКомбинаций КАК КоличествоКомбинаций
        ПО ЧислаДо1000.Число <= КоличествоКомбинаций.КолвоКомб
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВсеНомераКомб.Число,
    ИсходнаяТабл.НоменПП,
    ИсходнаяТабл.ИмяЧела
ИЗ
    ВсеНомераКомб КАК ВсеНомераКомб
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ИсходнаяТабл КАК ИсходнаяТабл
        ПО (ВЫБОР
                КОГДА (ВЫРАЗИТЬ(ВсеНомераКомб.Число / ИсходнаяТабл.ДобавленаяКолонка - 0.5 КАК ЧИСЛО(15, 0))) = (ВЫРАЗИТЬ(ВсеНомераКомб.Число / ИсходнаяТабл.ДобавленаяКолонка КАК ЧИСЛО(15, 0)))
                    ТОГДА ИСТИНА
                ИНАЧЕ ЛОЖЬ
            КОНЕЦ)
47 r152
 
31.08.15
09:49
вот что нужно.
но доп колонка:  это -  (2 ^ (НомерПП+1))
48 r152
 
31.08.15
09:49
Мож как проще можно???
49 gigi789
 
31.08.15
09:51
(46) уменьш код используй двоичную систему а потом переводи в десятеричную
50 r152
 
31.08.15
09:51
(49)а как это сделать в запросе?
51 gigi789
 
31.08.15
09:52
(49) Но имхо пробежаться циклами по тз будет быстрее в разы
52 gigi789
 
31.08.15
09:52
(50) Как ты оперируеш десятеричной так же оперируй только двоичной
53 r152
 
31.08.15
09:53
(52) это как ведь в запросах: 1+1 будет 2  , а нужно 11
54 Chameleon1980
 
31.08.15
09:56
1+1=10
55 gigi789
 
31.08.15
09:57
ВЫБРАТЬ
    0 КАК Поле1
ПОМЕСТИТЬ Числа

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    1
;
ВЫБРАТЬ
    Числа2.Поле1 + Числа1.Поле1 * 2 + Числа.Поле1 * 4 Числа3.Поле1*8 + Числа4.Поле1 * 16+ Числа5.Поле1 * 32 КАК Число
ПОМЕСТИТЬ ЧислаДо1024
ИЗ
    Числа КАК Числа,
    Числа КАК Числа1,
    Числа КАК Числа3,
Числа КАК Числа2,
  Числа КАК Числа4,
  Числа КАК Числа5,
;
56 patapum
 
31.08.15
09:57
(46) что это за порнография???
что ты на выходе хочешь? если комбинацию из 2-3 имен, то как последний запрос пакета это реализует?
57 gigi789
 
31.08.15
09:58
(55) суть таже самая только портянка меньше
58 r152
 
31.08.15
09:59
(57) это да, но далеше то как ...
* 64 * 128 * 256 * 512  так чтоли?  
это сколькож надо
59 r152
 
31.08.15
10:01
(56) в результате
к у каждой комбинации (колонка число)  разный комплект имен
60 Мимохожий Однако
 
31.08.15
10:02
ОФФ: Вспомнилась притча о зернышках и шахматной доске...
ИМХО. Автор темнит или развлекается.
61 gigi789
 
31.08.15
10:02
(58) У тя в любом случае Не универсальный код получится Да и 512 это уже 200 с лишнем тысяч, более универсально это пробежка по тз
62 gigi789
 
31.08.15
10:03
(61) Давай голосовалку я голосую использовать цикл и тз тогда не нужно парится с тем что на входе
63 gigi789
 
31.08.15
10:04
(62) Запрос будет медленнее работать из-за того, что придется городить уеву тучу вспомогательных таблиц
64 Лодырь
 
31.08.15
10:07
Кстати, вариант без всяких там умножений.
1. Помещаем в Т две записи
Истина
Ложь
2. Генерируем таблицу комбинаций(из N колонок) как Т^N, то бишь ТхТхТ...хТ.
3. Соединяем таблицу комбинаций с таблицей имен.
65 r152
 
31.08.15
10:07
На самом деле задача выглядит так:
есть список: материалов:   20 шт гвоздей
                           8 шт доска


есть спецификации:   1 стол   комплектующие(10 гвоздей, 4 доски)
                     2 стул   (4 гвоздя, 2 доски)
                     3 кровать  (8 гвоздей, 5 досок)

нужно получить: как раскомплектовать весь материал чтобы остатка осталось минимум.
66 r152
 
31.08.15
10:10
я думаю что нужно сначала определить все комбинаци
тоесть будет таблица   1 комба стол  требуется ,,,
2 комба стул
3 комба стол + стул  

и сравнить  эту таблицу с тем что у нас есть.
67 gigi789
 
31.08.15
10:10
(65) Задача чемодана решается не полным переборам))
68 Timon1405
 
31.08.15
10:10
69 gigi789
 
31.08.15
10:11
(67) Есть простой алгоритм: Сначала бери самое большое потом смотри сколько осталось и опять самое большое из возможного ит тд
70 r152
 
31.08.15
10:13
(68) Оч интересно
71 r152
 
31.08.15
10:14
(69) а может быть такое: что мелкими наберем в сумме больше!
72 Ildarovich
 
31.08.15
10:15
В статье "Запрос-комбинатор" http://catalog.mista.ru/public/295343/ есть универсальное решение именно этой задачи. На вход нужно подать таблицу
1 ""
1 Леша
2 ""
2 Женя
3 ""
3 Антон
Получится таблица всех возможных наборов свойств 1 - 2 - 3.
Правда таблица будет иметь вид (номер варианта - номер свойства - значение свойства)
0 1 ""
0 2 ""
0 3 ""
1 1 Леша
1 2 ""
1 3 ""
...
7 1 Леша
7 2 Женя
7 3 Антон
и ее будет еще необходимо свернуть.
Если универсальность не нужна, возьмите три таблицы:
А: ("", Леша), Б: ("", Женя), С: ("", Антон) и просто перемножьте их:
ВЫБРАТЬ А.Имя + " " + Б.Имя + " " С.Имя ИЗ А, Б, С.
73 gigi789
 
31.08.15
10:18
(71)Вероятность существует По сути то что я писал это жадный алгорим. Просто скорость выполнения будет в разы больше. А для производства имхо логичнее выпускать не то чтоб была возможность потратить весь материал, а то что перенесет наибольшую прибыль.
74 Ildarovich
 
31.08.15
10:18
Для ясности +(72) в последнем запросе таблица А, например, получается так:
ВЫБРАТЬ
Леша КАК ИМЯ
ПОМЕСТИТЬ А
ОБЪЕДИНИТЬ
ВЫБРАТЬ
""
;
75 r152
 
31.08.15
10:22
(74) не вариант. так как нужно
леша и женя   всумме,
Леша и антон   всумме  и т.д
76 Ildarovich
 
31.08.15
10:26
(75) что значит "всумме"?
77 Ildarovich
 
31.08.15
10:32
В (72) предложено ИМЕННО ТО, о чем спрашивается в (0). Вам нужно постараться понять это.

Из (65) следует, что вопрос в (0) вам не нужен. То, о чем вы спрашиваете называется задачей линейного программирования. Решается симплекс-методом. Это быстрый и точный метод. На Инфостарте есть примеры (два) его применения с использованием внешних компонент. Решения запросом вы не найдете. Оно еще не опубликовано. Ждите.
78 r152
 
31.08.15
10:40
(77) Жаль (((
79 r152
 
31.08.15
10:41
(72) в статье не радует:

Последний запрос нужно повторить ]Log2(N)[ раз  в зависимости от общего количества свойств N.
80 ASU_Diamond
 
31.08.15
10:48
(65) а что значит "остатка осталось минимум"?
вот из этих 2х вариантов что оптимальней:
6 досок и 19 гвоздей
8 досок и 12 гвоздей?
81 r152
 
31.08.15
11:00
(80) ну да. это еще не полная задача была.
ещё...  у каждого материала есть свой вес по отношению к другому...

1 доска  = 10 гвоздей по значимости :

тоесть сравнивая остаток:
1 вариант) 2 доски и 9 гвоздя
2 вариант) 3 доски

первый вариант меньше
82 r152
 
31.08.15
11:03
и  ещё задача усложняется тем что
может быть изготовлено и не по одному изделию а

результатом может быть типа:

2 шт стола
3 шт стула
83 r152
 
31.08.15
11:04
тоесть комбинации может быть и такие:
1 стол
2 стула,

1 стол,
3 стула,

и т.д..
84 gigi789
 
31.08.15
11:05
(81) Так считай те тогда Себестоимость и профит а не материал и изделия
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.