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

Откуда:
Сообщений: 506
есть 2 таблчки:
+
declare @T table (tovar char,kol int, data datetime)
insert @T1
select 'a',10,'2001'
union
select 'b',20,'2001'
union
select 'a',15,'2001'
union
select 'c',20,'2002'
union
select 'a',25,'2002'
union
select 'a',3,'2003'
union
select 'a',10,'2004'
union
select 'c',1,'2005'
declare @T2 table (tovar char,kol int, data datetime)
insert @T2
select * from @T1 

tovar kol         data
----- ----------- -----------------------
a     10          2001-01-01 00:00:00.000
a     15          2001-01-01 00:00:00.000
b     20          2001-01-01 00:00:00.000
c     20          2002-01-01 00:00:00.000
a     25          2002-01-01 00:00:00.000
a     3           2003-01-01 00:00:00.000
a     10          2004-01-01 00:00:00.000
c     1           2005-01-01 00:00:00.000

хочу обновить Т2 след образом. t2.kol=t2.kol+t1.kol where t2.tovar=t1.tovar and t2.data>=t1.data и чтоб это действия происходила для каждой строки Т1. т.е. для товара "а" увеличить сначала на 10 потом 15,25,3,10 где t2.data>=t1.data сделал так, но не то:
update t2 set t2.kol=t2.kol+t1.kol
	from @t2 t2
		join
	where t2.tovar=t1.tovar and t2.data>=t1.data
только без использование фуекции SUM()
2 май 12, 15:14    [12496262]     Ответить | Цитировать Сообщить модератору
 Re: обновление таблиц  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
а почему
только без использование фуекции SUM() 
?
2 май 12, 15:18    [12496290]     Ответить | Цитировать Сообщить модератору
 Re: обновление таблиц  [new]
ZVER-10
Member

Откуда:
Сообщений: 506
Мистер Хенки,
если нельзя без этой функции, то можно и с ф-ии СУМ(). но желательно без
2 май 12, 15:22    [12496336]     Ответить | Цитировать Сообщить модератору
 Re: обновление таблиц  [new]
Glory
Member

Откуда:
Сообщений: 104751
ZVER-10
только без использование фуекции SUM()

Тогда так аккуратно и медленно курсорчиком.
2 май 12, 15:24    [12496357]     Ответить | Цитировать Сообщить модератору
 Re: обновление таблиц  [new]
ZVER-10
Member

Откуда:
Сообщений: 506
Glory,
без курсора и цикла никак?
2 май 12, 15:25    [12496368]     Ответить | Цитировать Сообщить модератору
 Re: обновление таблиц  [new]
Glory
Member

Откуда:
Сообщений: 104751
ZVER-10
без курсора и цикла никак?

Эмулировать SUM() ? Никак
2 май 12, 15:27    [12496385]     Ответить | Цитировать Сообщить модератору
 Re: обновление таблиц  [new]
ZVER-10
Member

Откуда:
Сообщений: 506
Glory,
спс)
2 май 12, 15:27    [12496400]     Ответить | Цитировать Сообщить модератору
 Re: обновление таблиц  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
ZVER-10
Мистер Хенки,
если нельзя без этой функции, то можно и с ф-ии СУМ(). но желательно без

Просто очень интересно чем sum провинилась . Видимо в постановке есть какие-то моменты которые ты не озвучиваешь.
2 май 12, 15:29    [12496414]     Ответить | Цитировать Сообщить модератору
 Re: обновление таблиц  [new]
ZVER-10
Member

Откуда:
Сообщений: 506
Мистер Хенки,
просто интересно было)
2 май 12, 15:37    [12496502]     Ответить | Цитировать Сообщить модератору
 Re: обновление таблиц  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
ZVER-10,

Чувствуется вы свой триггер (очередная версия оного -- 12492457), будете пытаться написать вечно. По-моему, вы его с НГ пишите...
Вот вам пример, допилите под свои нужды:
+
use tempdb;
go

create table dbo.Numbers
(
 n int primary key,
 check (n >= 0)
);

create table dbo.Registry
(
 reg_id int not null identity,
 store_id int not null,
 goods_id int not null,
 OperationQuantity int not null,
 OperationTimestamp datetime not null default getdate(),
 OperationDate as cast(OperationTimestamp as date),
 primary key (reg_id)
);

create table dbo.Remains
(
 rem_id int not null identity,
 store_id int not null,
 goods_id int not null,
 OnDate date not null,
 Quantity int not null,
 primary key (rem_id),
 unique (goods_id, store_id, OnDate),
 check (Quantity >= 0)
)
go

create trigger dbo.trUpdateRemains
on dbo.Registry
for insert, update, delete
as
begin
 if @@rowcount = 0
  return;
 
 set nocount on;
 
 declare @t table (goods_id int, store_id int, StartDate date, EndDate date, CumulativeQuantityDelta int);
 
 with d as
 (
  select
   store_id, goods_id, OperationQuantity, OperationDate
  from
   inserted
 
  union all

  select
   store_id, goods_id, -OperationQuantity, OperationDate
  from
   deleted
 ),
 s as
 (
  select
   store_id, goods_id, OperationDate, sum(OperationQuantity) as QuantityDelta
  from
   d
  group by
   store_id, goods_id, OperationDate
 )
 insert into @t
  (goods_id, store_id, StartDate, EndDate, CumulativeQuantityDelta)
 select
  t1.goods_id, t1.store_id, t1.OperationDate, coalesce(x.NextOperationDate, r.MaxOnDate, t1.OperationDate),
  sum(t2.QuantityDelta)
 from
  s t1 join
  s t2 on t2.goods_id = t1.goods_id and t2.store_id = t1.store_id and t2.OperationDate <= t1.OperationDate outer apply
  (select top (1) dateadd(day, -1, OperationDate) from s where goods_id = t1.goods_id and store_id = t1.store_id and OperationDate > t1.OperationDate order by OperationDate) x(NextOperationDate) outer apply
  (select top (1) max(OnDate) from dbo.Remains where goods_id = t1.goods_id and store_id = t1.store_id) r(MaxOnDate) 
 group by
  t1.goods_id, t1.store_id, t1.OperationDate, x.NextOperationDate, r.MaxOnDate;
 
 with cqd as
 (   
  select
   t.goods_id, t.store_id, dateadd(d, n.n, t.StartDate) as OnDate,
   t.CumulativeQuantityDelta
  from
   @t t join
   dbo.Numbers n on n.n between 0 and datediff(d, t.StartDate, t.EndDate)
 )
 merge into dbo.Remains r
 using cqd on r.goods_id = cqd.goods_id and r.store_id = cqd.store_id and r.OnDate = cqd.OnDate
 when not matched then
  insert(goods_id, store_id, OnDate, Quantity) values (cqd.goods_id, cqd.store_id, cqd.OnDate, cqd.CumulativeQuantityDelta)
 when matched then
  update
   set Quantity += cqd.CumulativeQuantityDelta;
 
end;
go

with x as
(
 select
  t.d
 from
  (values (0), (1), (2), (3), (4), (5), (6), (7), (8), (9)) t(d)
)
insert into dbo.Numbers
select
 d3.d * 1000 + d2.d * 100 + d1.d * 10 + d0.d
from
 x d0 cross join
 x d1 cross join
 x d2 cross join
 x d3;
 
insert into dbo.Registry
 (store_id, goods_id, OperationQuantity, OperationTimestamp)
values
 (1, 1, 5, '20120502 10:00'),
 (1, 1, -2, '20120502 11:00'),
 (1, 1, 4, '20120504 10:00'),
 (1, 1, 1, '20120506 10:00'),
 (1, 1, -5, '20120510 10:00'),
 (1, 1, 8, '20120512 10:00');

select * from dbo.Remains order by store_id, goods_id, OnDate;

insert into dbo.Registry
 (store_id, goods_id, OperationQuantity, OperationTimestamp)
values
 (1, 1, 10, '20120501 10:00'),
 (1, 1, -5, '20120505 10:00');

select * from dbo.Remains order by store_id, goods_id, OnDate;

update dbo.Registry
 set
  OperationQuantity = 2
where
 reg_id = 3;

select * from dbo.Remains order by store_id, goods_id, OnDate;

delete dbo.Registry where reg_id = 3;

select * from dbo.Remains order by store_id, goods_id, OnDate;
go
 
drop table dbo.Registry;
drop table dbo.Remains;
drop table dbo.Numbers;
go
2 май 12, 22:26    [12498251]     Ответить | Цитировать Сообщить модератору
 Re: обновление таблиц  [new]
ZVER-10
Member

Откуда:
Сообщений: 506
invm,
спс)
2 май 12, 23:56    [12498467]     Ответить | Цитировать Сообщить модератору
 Re: обновление таблиц  [new]
ZVER-10
Member

Откуда:
Сообщений: 506
invm,
а merge на много быстрее чем просто инсерт с джоинами? тут смотрю мердж использовали, хочу переделать под 2005
3 май 12, 20:09    [12504025]     Ответить | Цитировать Сообщить модератору
 Re: обновление таблиц  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
ZVER-10,

Во-первых, инсерта с джойнами не бывает.
Во-вторых, какая разница насколько merge быстрее или медленнее, чем update+insert, если в 2005 его нет?
3 май 12, 20:20    [12504063]     Ответить | Цитировать Сообщить модератору
 Re: обновление таблиц  [new]
ZVER-10
Member

Откуда:
Сообщений: 506
invm,
ну да...
3 май 12, 20:24    [12504081]     Ответить | Цитировать Сообщить модератору
 Re: обновление таблиц  [new]
ZVER-10
Member

Откуда:
Сообщений: 506
invm,
2008 можно найти, но ща не очень охота
3 май 12, 20:26    [12504086]     Ответить | Цитировать Сообщить модератору
 Re: обновление таблиц  [new]
ZVER-10
Member

Откуда:
Сообщений: 506
invm,
мда, не знал что MERGE такой волшебник. спс вам еще раз. прочитал про MERGE завтра точно 2008 поставлю)
4 май 12, 01:15    [12505196]     Ответить | Цитировать Сообщить модератору
 Re: обновление таблиц  [new]
ZVER-10
Member

Откуда:
Сообщений: 506
invm,
30 май 12, 16:42    [12638954]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить