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

Помогите, плиз, с запросом:
есть таблица
declare @tmp table(
    id int  identity(1,1) primary key,
	idval int NOT NULL,
	val int NULL)

insert @tmp (idval,val)	
select 1,10
union all
select 3,11
union all
select 6,12
union all
select 1,13
union all
select 3,14
union all
select 6,15
union all
select 1,16
union all
select 4,16
union all
select 6,16
select * from @tmp


необходимо найти все суммы всех возможных комбинаций по idval - комбинация задана в таблице
declare @tmpids table(idval int)
insert @tmpids
select 1
union all
select 3
union all
select 6
select * from @tmpids


т.е.
10+11+12
10+12+15
10+12+16
...
13+14+16
...
1 авг 12, 14:30    [12946577]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом: сумма заданных комбинаций  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
;with cte
as
(
select t1.idval, t1.val from @tmp t1
inner join @tmpids t2
on t1.idval = t2.idval
)

select convert( varchar, t1.val ) +  ' + ' 
     + convert( varchar, t2.val ) +  ' + '
     + convert( varchar, t3.val ) 
from cte t1, cte t2, cte t3
where t1.idval != t2.idval and t1.idval != t3.idval
and t2.idval != t3.idval
and t3.idval != t1.idval
order by t1.idval, t2.idval, t3.idval
1 авг 12, 14:40    [12946643]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом: сумма заданных комбинаций  [new]
__temp__
Guest
да, но количество записей в @tmpids м.б. произвольным
н-р
insert @tmpids
select 1
union all
select 6
1 авг 12, 14:46    [12946685]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом: сумма заданных комбинаций  [new]
__temp__
Guest
ну и, одинаковые наборы по идешникам не учитывать
т.е. набор ид=1,2, 6 равен набору 2,1, 6 - т.е. второй выводить уже не надо
1 авг 12, 14:57    [12946777]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом: сумма заданных комбинаций  [new]
Читатель неместный
Guest
каждый idval из @tmpids должен участвовать строго по одному разу?
тогда откуда
10+12+15
10+12+16
?
10+11+15
10+11+16
так должно быть?
1 авг 12, 15:08    [12946856]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом: сумма заданных комбинаций  [new]
__temp__
Guest
Читатель неместный,
ну почему-же?
просто нужно складывать одинаковый набор строк (по ид строки) один раз, т.е. набор строк ид=(1,2) равен (2,1) и их сумма одинакова
но в принципе можно пока на это забить
1 авг 12, 15:24    [12946989]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом: сумма заданных комбинаций  [new]
__temp__
Guest
подправил условие для понимания
вычислить суммы, по всем наборам идешников, заданных в другой таблице
declare @tmp table(
    id int  identity(1,1) primary key,
    idgrp int,
	idval int NOT NULL,
	val int NULL)

insert @tmp (idval,idgrp,val)	
select 1,1,10
union all
select 3,1,11
union all
select 6,1,12
union all
select 1,1,13
union all
select 3,1,14
union all
select 6,1,15
union all
select 1,1,16
union all
select 4,1,16
union all
select 6,1,16
union all
select 3,2,11
union all
select 6,2,12
union all
select 1,2,13
union all
select 3,2,14
union all
select 6,2,15
union all
select 1,2,16
union all
select 4,2,16


select * from @tmp

declare @tmpids table(idgrp int, idval int)
insert @tmpids
select 1,1
union all
select 1,3
union all
select 1,6
union all
select 2,3
union all
select 2,6

select * from @tmpids


т.е. для idgrp=2, вычисляем суммы по набору (3,6)
1 авг 12, 15:26    [12947012]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом: сумма заданных комбинаций  [new]
__temp__
Guest
даже, так
определить, в каких группах в таблице @tmp содержатся суммы, заданные в таблице @tmpids

declare @tmpids table(idgrp int, idval int, val int)
insert @tmpids
select 1,1,30
union all
select 1,3,2
union all
select 1,6,1
union all
select 2,3,30
union all
select 2,6,3

select * from @tmpids


т.е., н-р, определить, содержит ли группа(1), сочетание idval(1,3,6), дающее сумму(33)
2 авг 12, 05:43    [12949935]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом: сумма заданных комбинаций  [new]
aleks2
Guest
declare @tmp table(
    id int  identity(1,1) primary key,
	idval int NOT NULL,
	val int NULL)

insert @tmp (idval,val)	
select 1,10
union all
select 3,11
union all
select 6,12
union all
select 1,13
union all
select 3,14
union all
select 6,15
union all
select 1,16
union all
select 4,16
union all
select 6,16

declare @tmpids table(idval int)
insert @tmpids
select 1
union all
select 3
union all
select 6

------------------------------

declare @t table (c varchar(4000) not null, s int not null, level int not null, id int identity, primary key clustered(level, id))

declare @i int, @l int

select @i = min(idval) from @tmpids

set @l = 0

insert @t(c, s, level) values('', 0, 0)

while @i is not null begin
  insert @t(c, s, level) 
    select t.c+case t.c when '' then '' else '+' end+cast(x.val as varchar(16)), t.s+x.val, @l+1
      from (select * from @t where level = @l) t
           cross join
           (select * from @tmp where idval = @i) x
  
  set @i = (select min(idval) from @tmpids where idval>@i)
  set @l = @l+1
end

select c, s from @t where level = @l


составной идентификатор idval,idgrp ничо принципиально не меняет.
2 авг 12, 06:30    [12949950]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом: сумма заданных комбинаций  [new]
Читатель неместный
Guest
аЙда aleks2, аЙда ... сын. :)

очень может пригодиться. Спасибо
2 авг 12, 08:48    [12950104]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить