powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Все комбинации сумм
15 сообщений из 15, страница 1 из 1
Все комбинации сумм
    #39671057
loky1109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть несколько, пусть восемь, чисел (скажем: 20, 20, 15, 11, 11, 7, 6, 6).
Каждое из числе может быть любого из трёх цветов (скажем: красный, синий, зелёный).

Числа одинакового цвета суммируются.

Нужно получить все возможные комбинации сумм.

Мысль решать данную задачу НЕ посредством SQL здравая, но, увы, на практике в данном случае неприменимая.
...
Рейтинг: 0 / 0
Все комбинации сумм
    #39671061
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
loky1109Числа одинакового цвета суммируются.
select цвет, sum(число) from таблица group by цвет
...
Рейтинг: 0 / 0
Все комбинации сумм
    #39671062
loky1109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-2-loky1109Числа одинакового цвета суммируются.
select цвет, sum(число) from таблица group by цвет

Не катит.
авторКаждое из числе может быть любого из трёх цветов (скажем: красный, синий, зелёный).
авторНужно получить все возможные комбинации сумм.
...
Рейтинг: 0 / 0
Все комбинации сумм
    #39671063
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторКаждое из числе может быть любого из трёх цветов (скажем: красный, синий, зелёный).
constraint любойизтрех check (цвет in (красный, синий, зеленый))

авторНужно получить все возможные комбинации сумм.это и есть все возможные для "Числа одинакового цвета суммируются". оно же единственное, ввиду коммутативности суммы.
...
Рейтинг: 0 / 0
Все комбинации сумм
    #39671067
loky1109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Для полной ясности: числа с цветами не связаны.
20 - красное, 20 - красное, 15 - красное, 11 - красное, 11 - красное, 7 - красное, 6 - красное, 6 - красное => красное=96, зелёное=0, синее=0
20 - красное, 20 - красное, 15 - красное, 11 - красное, 11 - красное, 7 - красное, 6 - красное, 6 - синее => красное=90, зелёное=0, синее=6
20 - красное, 20 - красное, 15 - красное, 11 - красное, 11 - красное, 7 - красное, 6 - красное, 6 - зелёное => красное=90, зелёное=6, синее=0
...
и так далее
...
Рейтинг: 0 / 0
Все комбинации сумм
    #39671068
loky1109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И ещё одно.

20 - красное, 20 - зелёное, 15 - красное, 11 - красное, 11 - красное, 7 - красное, 6 - красное, 6 - красное
и
20 - зелёное, 20 - красное, 15 - красное, 11 - красное, 11 - красное, 7 - красное, 6 - красное, 6 - красное

это разные комбинации.
...
Рейтинг: 0 / 0
Все комбинации сумм
    #39671608
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
loky1109Есть несколько, пусть восемь, чисел (скажем: 20, 20, 15, 11, 11, 7, 6, 6).
Каждое из числе может быть любого из трёх цветов (скажем: красный, синий, зелёный).

Числа одинакового цвета суммируются.

Нужно получить все возможные комбинации сумм.

Мысль решать данную задачу НЕ посредством SQL здравая, но, увы, на практике в данном случае неприменимая.
восемь и три константы относительно селекта?

если не константы, то селект сгенерить динамически

.....
stax
...
Рейтинг: 0 / 0
Все комбинации сумм
    #39671640
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имея 2-3-7
Получить:
2-красный;3-синий;7-зелёный;
0-красный;5-синий;7-зелёный;
0-красный;3-синий;9-зелёный;
5-красный;0-синий;7-зелёный;
2-красный;0-синий;10-зелёный;
9-красный;3-синий;0-зелёный;
2-красный;10-синий;0-зелёный;
3-красный;2-синий;7-зелёный;
--0-красный;5-синий;7-зелёный;
0-красный;2-синий;10-зелёный;
--5-красный;0-синий;7-зелёный;
3-красный;0-синий;9-зелёный;
10-красный;2-синий;0-зелёный;
3-красный;9-синий;0-зелёный;
и т.д.?
...
Рейтинг: 0 / 0
Все комбинации сумм
    #39671645
Фотография Павел Воронцов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
loky1109,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
with num as (select 20 as num from dual
union all
select 20 as num from dual
union all
select 11 as num from dual
union all
select 10 as num from dual
union all
select 5 as num from dual
union all
select 5 as num from dual
union all
select 3 as num from dual
),
color as (select 'red' as c from dual
union all select 'yellow' from dual
union all select 'blue' from dual),
src as (select num, c, row_number() over (order by num,c) as rn from num, color),
ordinal (n) as (select 1 as n from dual
union all
select n+1 as n from ordinal where n <=power(2,(select max(rn) from src))),
two as (select src.num, src.c, src.rn, ord.n from src join ordinal ord 
on bitand(power(2,src.rn), ord.n) > 0)
select c, n, sum(num) as snum from two 
group by c, n
having count(*) = (select max(rn) from src)



Не оптимально. Идеи взяты тут http://www.sql.ru/forum/56272/zadachka-dlya-guru
...
Рейтинг: 0 / 0
Все комбинации сумм
    #39671724
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
with q(val) as (select 20 from dual union all
select 20 as num from dual union all
select 15 as num from dual union all
select 11 as num from dual union all
select 11 as num from dual)

, w(color) as (select 'Red' from dual union all
select 'Green' from dual union all
select 'Blue' from dual)

, e as (select rownum-1 as rn, val from q)

, r as (select e.*, w.*, prior color as rc, level as lvl
from e, w connect by prior e.rn = e.rn-1 start with rn = 0)

select distinct case when r1.color = 'Red' then r1.val else 0 end
+ case when r2.color = 'Red' then r2.val else 0 end
+ case when r3.color = 'Red' then r3.val else 0 end
+ case when r4.color = 'Red' then r4.val else 0 end
+ case when r5.color = 'Red' then r5.val else 0 end as R
, case when r1.color = 'Green' then r1.val else 0 end
+ case when r2.color = 'Green' then r2.val else 0 end
+ case when r3.color = 'Green' then r3.val else 0 end
+ case when r4.color = 'Green' then r4.val else 0 end
+ case when r5.color = 'Green' then r5.val else 0 end as G
, case when r1.color = 'Blue' then r1.val else 0 end
+ case when r2.color = 'Blue' then r2.val else 0 end
+ case when r3.color = 'Blue' then r3.val else 0 end
+ case when r4.color = 'Blue' then r4.val else 0 end
+ case when r5.color = 'Blue' then r5.val else 0 end as B
, r1.val + r2.val + r3.val + r4.val + r5.val as RGB
 from r r1 
join r r2 on r1.color = r2.rc and r2.lvl = 2 
join r r3 on r2.color = r3.rc and r3.lvl = 3
join r r4 on r3.color = r4.rc and r4.lvl = 4
join r r5 on r4.color = r5.rc and r5.lvl = 5
where r1.lvl = 1 
order by 1, 2, 3


Топорно и дальше 5 значений лучше не смотреть.
...
Рейтинг: 0 / 0
Все комбинации сумм
    #39671728
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Воронцов,
возможно немножко не то

імхо
строк три в восьмой

пар сответственно к-во строк * на восем

....
stax
...
Рейтинг: 0 / 0
Все комбинации сумм
    #39671748
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
with da(x) as (select 1 from dual union all select 10 from dual union all select 100 from dual union all select 1000 from dual), 
co(c) as (select 'red' from dual union all select 'green' from dual union all select 'blue' from dual),
cc(n,m) as (select (select count(*) from da), (select count(*) from co) from dual),
ccc (se, cn) as (select level-1, m from cc connect by level <= power(m, n))
select se, c, sum(x) sx
from (
  select se, x, c
  from ccc
  cross join (select rownum-1 rx, x from da) 
  join (select rownum-1 cx, c from co) on cx = mod(trunc(se/power(cn, rx)), cn)
)
group by se, c
order by se, c
...
Рейтинг: 0 / 0
Все комбинации сумм
    #39671750
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dshedoo,

код зависит от к-ва строк в колор и суммах
если утраивает, то можно проще, если num представить в виде строки

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
SQL> ed
Wrote file afiedt.buf

  1  with num as (select 20 s1, 20 s2, 15 s3, 11 s4, 11 s5, 7 s6, 6 s7, 6 s8 from dual)
  2  ,r as (
  3            select 'r' as c from dual
  4  union all select 'y' from dual
  5  union all select 'b' from dual)
  6  select --distinct
  7  r1.c,r2.c,r3.c,r4.c,r5.c,r6.c,r7.c,r8.c
  8  ,
  9   decode(r1.c,'r',s1,0)+decode(r2.c,'r',s2,0)+decode(r3.c,'r',s3,0)+decode(r4.c,'r',s4,0)+
 10   decode(r5.c,'r',s5,0)+decode(r6.c,'r',s6,0)+decode(r7.c,'r',s7,0)+decode(r8.c,'r',s8,0) r
 11  ,
 12   decode(r1.c,'y',s1,0)+decode(r2.c,'y',s2,0)+decode(r3.c,'y',s3,0)+decode(r4.c,'y',s4,0)+
 13   decode(r5.c,'y',s5,0)+decode(r6.c,'y',s6,0)+decode(r7.c,'y',s7,0)+decode(r8.c,'y',s8,0) y
 14  ,
 15   decode(r1.c,'b',s1,0)+decode(r2.c,'b',s2,0)+decode(r3.c,'b',s3,0)+decode(r4.c,'b',s4,0)+
 16   decode(r5.c,'b',s5,0)+decode(r6.c,'b',s6,0)+decode(r7.c,'b',s7,0)+decode(r8.c,'b',s8,0) b
 17  from r r1,r r2,r r3,r r4,r r5,r r6,r r7,r r8,num
 18* where rownum<9
SQL> /

C C C C C C C C          R          Y          B
- - - - - - - - ---------- ---------- ----------
r r r r r r r r         96          0          0
y r r r r r r r         76         20          0
b r r r r r r r         76          0         20
r y r r r r r r         76         20          0
y y r r r r r r         56         40          0
b y r r r r r r         56         20         20
r b r r r r r r         76          0         20
y b r r r r r r         56         20         20

8 rows selected.



к-во уникальных значений
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
  1  with num as (select 20 s1, 20 s2, 15 s3, 11 s4, 11 s5, 7 s6, 6 s7, 6 s8 from dual)
  2  ,r as (
  3            select 'r' as c from dual
  4  union all select 'y' from dual
  5  union all select 'b' from dual)
  6  select count(distinct r||'.'||y||'.'||b) cc from
  7  (
  8  select
  9  r1.c,r2.c,r3.c,r4.c,r5.c,r6.c,r7.c,r8.c
 10  ,
 11   decode(r1.c,'r',s1,0)+decode(r2.c,'r',s2,0)+decode(r3.c,'r',s3,0)+decode(r4.c,'r',s4,0)+
 12   decode(r5.c,'r',s5,0)+decode(r6.c,'r',s6,0)+decode(r7.c,'r',s7,0)+decode(r8.c,'r',s8,0) r
 13  ,
 14   decode(r1.c,'y',s1,0)+decode(r2.c,'y',s2,0)+decode(r3.c,'y',s3,0)+decode(r4.c,'y',s4,0)+
 15   decode(r5.c,'y',s5,0)+decode(r6.c,'y',s6,0)+decode(r7.c,'y',s7,0)+decode(r8.c,'y',s8,0) y
 16  ,
 17   decode(r1.c,'b',s1,0)+decode(r2.c,'b',s2,0)+decode(r3.c,'b',s3,0)+decode(r4.c,'b',s4,0)+
 18   decode(r5.c,'b',s5,0)+decode(r6.c,'b',s6,0)+decode(r7.c,'b',s7,0)+decode(r8.c,'b',s8,0) b
 19  from r r1,r r2,r r3,r r4,r r5,r r6,r r7,r r8,num
 20  --where rownum<9
 21* )
SQL> /

        CC
----------
      1521



.....
stax
...
Рейтинг: 0 / 0
Все комбинации сумм
    #39671937
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax,

Ну тут 3-чная система счислений для 8 знаков и посему наборов будет:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
  select
 sum( substr(lpad(2,8,2),level,1)*power(3,level-1)) cn
 from dual
 connect by level < length(lpad(2,8,2))

CN
2186



И в уникальных считать их нельзя.
...
Рейтинг: 0 / 0
Все комбинации сумм
    #39672011
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximaXXL,
ничего не понял, но ето и не важно

авторНу тут 3-чная система счислений для 8 знаков и посему наборов будет:


имхо
наборов будет 3**8
к-во унікальних сум зависит от набора восьми чисел

.....
stax
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Все комбинации сумм
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]