|
Как получить все комбинации значений в запросе | ☑ | ||
---|---|---|---|---|
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) Так считай те тогда Себестоимость и профит а не материал и изделия
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |