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

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

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

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

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

авторНужно получить все возможные комбинации сумм.это и есть все возможные для "Числа одинакового цвета суммируются". оно же единственное, ввиду коммутативности суммы.
...
Рейтинг: 0 / 0
07.07.2018, 18:23
    #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
07.07.2018, 18:24
    #39671068
loky1109
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Все комбинации сумм
И ещё одно.

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

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

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

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

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

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

.....
stax
...
Рейтинг: 0 / 0
09.07.2018, 14:34
    #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
09.07.2018, 14:43
    #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
09.07.2018, 17:05
    #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
09.07.2018, 17:15
    #39671728
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Все комбинации сумм
Павел Воронцов,
возможно немножко не то

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

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

....
stax
...
Рейтинг: 0 / 0
09.07.2018, 17:46
    #39671748
-2-
-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
09.07.2018, 17:51
    #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
10.07.2018, 10:54
    #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
10.07.2018, 12:32
    #39672011
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Все комбинации сумм
MaximaXXL,
ничего не понял, но ето и не важно

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


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

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


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