Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Всевозможные сочетания  [new]
Varcom
Member

Откуда:
Сообщений: 310
Есть группы элементов (GroupId, Id), например:
declare @Table table
(
  Id int,
  GroupId int,
  primary key (Id)
)

insert into @Table(GroupId, Id) values(1, 1)
insert into @Table(GroupId, Id) values(1, 2)

insert into @Table(GroupId, Id) values(2, 3)
insert into @Table(GroupId, Id) values(2, 4)

insert into @Table(GroupId, Id) values(3, 5)
insert into @Table(GroupId, Id) values(3, 6)
insert into @Table(GroupId, Id) values(3, 7)

Нужно найти всевозможные комбинации элементов из этих групп (по одному элементу из каждой):
(CombinationN, Id):
(1, 1) (1, 3) (1, 5)
(2, 1) (2, 3) (2, 6)
(3, 1) (3, 3) (3, 7)
(4, 1) (4, 4) (4, 5)
(5, 1) (5, 4) (5, 6)
...
(12, 2) (12, 4) (12, 7).
Групп может быть произвольное количество.
31 май 14, 12:08    [16100607]     Ответить | Цитировать Сообщить модератору
 Re: Всевозможные сочетания  [new]
aleks2
Guest
Varcom
Групп может быть произвольное количество.

С произвольным количеством групп - тока в цикле.
А так-то CROSS JOIN.
31 май 14, 12:35    [16100650]     Ответить | Цитировать Сообщить модератору
 Re: Всевозможные сочетания  [new]
Кот Матроскин
Member

Откуда: Москва
Сообщений: 8933
Varcom,
31 май 14, 13:58    [16100834]     Ответить | Цитировать Сообщить модератору
 Re: Всевозможные сочетания  [new]
Кот Матроскин
Member

Откуда: Москва
Сообщений: 8933
Varcom,
что-то у Вас шапка итоговой таблицы не соответствует содержимому - в шапке 2 колонки, в содержимом либо 3, либо 1
31 май 14, 14:01    [16100838]     Ответить | Цитировать Сообщить модератору
 Re: Всевозможные сочетания  [new]
Varcom
Member

Откуда:
Сообщений: 310
Кот Матроскин
Varcom,
что-то у Вас шапка итоговой таблицы не соответствует содержимому - в шапке 2 колонки, в содержимом либо 3, либо 1

Итоговая таблица состоит из 2 колонок (CombinationN, Id)
(1, 1)
(1, 3)
(1, 5)
...
(12, 2)
(12, 4)
(12, 7)
В первой колонке - порядковый номер сочетания, во второй - все относящиеся к этому сочетанию элементы.
Я, просто, объединил их в строки, для более компактного представления.
31 май 14, 14:14    [16100868]     Ответить | Цитировать Сообщить модератору
 Re: Всевозможные сочетания  [new]
vikkiv
Member

Откуда: EU
Сообщений: 2960
Varcom, можно так (заполнение таблицы циклом):
declare @t table(a int,b int);declare @a int=1,@b int
while @a<=10 begin set @b=1;while @b<=3 begin insert into @t values(@a,@b);set @b=@b+1 end set @a=@a+1 end
select*from @t
или так (исходные таблицы заполняются циклом а потом собственно решение через cross join):
declare @a table(a int);declare @b table(b int);declare @i int=1,@j int=1
while @i<=3 begin insert into @a values(@i);set @i=@i+1 end
while @j<=5 begin insert into @b values(@j);set @j=@j+1 end
select*from @a;select*from @b;select concat(a,'+',b)'a+b'from @a cross join @b
если есть повторения в исходных таблицах то можно исключить к примеру через distinct (перед concat в selec-ТЕ)
31 май 14, 18:29    [16101276]     Ответить | Цитировать Сообщить модератору
 Re: Всевозможные сочетания  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
declare @Table table(
  Id int,
  GroupId int,
  primary key (Id))
insert into @Table(GroupId, Id) values
  (1, 1),(1, 2),
  (2, 3),(2, 4),
  (3, 5),(3, 6),(3, 7),
  (4,8),
  (5,9)
;with rec as (
  select 1 lvl, convert(varchar(max),t.id)lst, t.GroupId
    from @Table t
    where t.GroupId=(select top (1) GroupId from @Table order by GroupId)
  union all
  select r.lvl+1,convert(varchar(max),CONCAT(r.lst,';',t.id)), t.GroupId
    from rec r
    join @Table t on t.GroupId=r.GroupId+1
    -- join @Table t on t.GroupId>r.GroupId
  )
select
  row_number()over(order by lst) id
  ,lst
from (
  select top (1) with ties 
    lst
  from rec
  order by lvl desc
  )t
-- option(MAXRECURSION 0)
idlst
11;3;5;8;9
21;3;6;8;9
31;3;7;8;9
41;4;5;8;9
51;4;6;8;9
61;4;7;8;9
72;3;5;8;9
82;3;6;8;9
92;3;7;8;9
102;4;5;8;9
112;4;6;8;9
122;4;7;8;9
1 июн 14, 12:18    [16102284]     Ответить | Цитировать Сообщить модератору
 Re: Всевозможные сочетания  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
Varcom
Нужно найти всевозможные комбинации элементов из этих групп (по одному элементу из каждой):
(CombinationN, Id):
(1, 1) (1, 3) (1, 5)
(2, 1) (2, 3) (2, 6)
(3, 1) (3, 3) (3, 7)
(4, 1) (4, 4) (4, 5)
(5, 1) (5, 4) (5, 6)
...
(12, 2) (12, 4) (12, 7).
Групп может быть произвольное количество.
ну и собственно разворачивание к требуемому виду:
;with rec as (
  select 1 lvl, convert(varchar(max),t.id)lst, t.GroupId
    from @Table t
    where t.GroupId=(select top (1) GroupId from @Table order by GroupId)
  union all
  select r.lvl+1,convert(varchar(max),CONCAT(r.lst,';',t.id)), t.GroupId
    from rec r
    join @Table t on t.GroupId=r.GroupId+1
    -- join @Table t on t.GroupId>r.GroupId
  )
,rez as(
  select row_number()over(order by lst) id, lst
  from (
    select top (1) with ties lst
    from rec
    order by lvl desc
    )t
  )
,itog as(
  select r.id, convert(int,left(lst,p-1))item, stuff(lst,1,p,'')lst
    from rez r
    cross apply(select CHARINDEX(';',r.lst+';'))a(p)
  union all
  select r.id, convert(int,left(lst,p-1))item, stuff(lst,1,p,'')
    from itog r
    cross apply(select CHARINDEX(';',r.lst+';'))a(p)
    where p>1
  )
select id,item from itog order by id,item
1 июн 14, 12:39    [16102315]     Ответить | Цитировать Сообщить модератору
 Re: Всевозможные сочетания  [new]
bodzin
Member

Откуда:
Сообщений: 10
Мой вариант самый простой и то он подходит к созданной таблице :)
CREATE TABLE Table1
(
  Id int,
  GroupId int,
  primary key (Id)
)

insert into Table1(GroupId, Id) values(1, 1)
insert into Table1(GroupId, Id) values(1, 2)

insert into Table1(GroupId, Id) values(2, 3)
insert into Table1(GroupId, Id) values(2, 4)

insert into Table1(GroupId, Id) values(3, 5)
insert into Table1(GroupId, Id) values(3, 6)
insert into Table1(GroupId, Id) values(3, 7)

CREATE VIEW GrId
AS SELECT GroupId FROM Table1
GO
CREATE VIEW Id
AS SELECT Id FROM Table1
GO
SELECT * FROM Id
      CROSS JOIN GrId
2 июн 14, 00:56    [16103871]     Ответить | Цитировать Сообщить модератору
 Re: Всевозможные сочетания  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Школьнег дорвался до интернета детектед.
bodzin, Зачем этот тупой спаминг бессмысленных вещей?
2 июн 14, 02:15    [16104004]     Ответить | Цитировать Сообщить модератору
 Re: Всевозможные сочетания  [new]
bodzin
Member

Откуда:
Сообщений: 10
Mnior, слышь умный, я только начал учить SQL и нечего придератся ко всем постам. Если есть конструктивные ответы - в студию. Нехер оффтопить.
2 июн 14, 12:00    [16105128]     Ответить | Цитировать Сообщить модератору
 Re: Всевозможные сочетания  [new]
Glory
Member

Откуда:
Сообщений: 104751
bodzin
я только начал учить SQL и нечего придератся ко всем постам

Тогда и не надо давать плохие советы

bodzin
Если есть конструктивные ответы - в студию

Их уже привели

bodzin
Нехер оффтопить.

Для начинающего изучать SQL, вы слишком высокого мнения о своем коде.
2 июн 14, 12:06    [16105184]     Ответить | Цитировать Сообщить модератору
 Re: Всевозможные сочетания  [new]
bodzin
Member

Откуда:
Сообщений: 10
Glory
bodzin
я только начал учить SQL и нечего придератся ко всем постам

Тогда и не надо давать плохие советы

bodzin
Если есть конструктивные ответы - в студию

Их уже привели

bodzin
Нехер оффтопить.

Для начинающего изучать SQL, вы слишком высокого мнения о своем коде.

С чего Вы взяли какого я мнения о своём коде? Если честно это глупое обсуждение, вижу тут сидят одни снобы-sql:)
2 июн 14, 12:08    [16105205]     Ответить | Цитировать Сообщить модератору
 Re: Всевозможные сочетания  [new]
Glory
Member

Откуда:
Сообщений: 104751
bodzin
С чего Вы взяли какого я мнения о своём коде?

С того, что вам не нравится, что его критикуют.

bodzin
Если честно это глупое обсуждение, вижу тут сидят одни снобы-sql:)

Не надо предлагать единственно известное вам решение. Особенно если вы не знаете других решений.
2 июн 14, 12:12    [16105244]     Ответить | Цитировать Сообщить модератору
 Re: Всевозможные сочетания  [new]
bodzin
Member

Откуда:
Сообщений: 10
Glory, хотите сказать это нормальная критика?
Mnior
Школьнег дорвался до интернета детектед.
bodzin, Зачем этот тупой спаминг бессмысленных вещей?

Проще написать было:"У тебя гавнокод, дружище:)" и кинуть идею где бы искать варианты для развития навыков. А не обзывать человека школьником, не зная его абсолютно
2 июн 14, 12:18    [16105304]     Ответить | Цитировать Сообщить модератору
 Re: Всевозможные сочетания  [new]
Glory
Member

Откуда:
Сообщений: 104751
bodzin
А не обзывать человека школьником, не зная его абсолютно

Потому что вы не только в этой теме постите говнокод, дружище.
2 июн 14, 12:19    [16105321]     Ответить | Цитировать Сообщить модератору
 Re: Всевозможные сочетания  [new]
bodzin
Member

Откуда:
Сообщений: 10
Glory
bodzin
А не обзывать человека школьником, не зная его абсолютно

Потому что вы не только в этой теме постите говнокод, дружище.
Спасибо :)
2 июн 14, 12:39    [16105508]     Ответить | Цитировать Сообщить модератору
 Re: Всевозможные сочетания  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8823
Varcom, похоже, что задача сводится к декартовому произведению двух колонок + PIVOT.
2 июн 14, 12:58    [16105666]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить