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

Откуда:
Сообщений: 18
Здраствуйте!
Помогите пожалуйста сделать запрос

У меня есть две таблицы Код, Диапазон
CREATE TABLE [dbo].[Table_1](
	[Код_1] [int] NULL,
	[Диапазон] [int] NULL
) ON [PRIMARY]

CREATE TABLE [dbo].[Table_2](
	[Код] [int] NULL,
	[Дата] [datetime] NULL,
	[Код_1] [int] NULL
) ON [PRIMARY]


У меня есть например значения в Table_1
Код_1 || Диапазон
1-------||-----3
2-------||----2
3-------||----5
4-------||----3

И значения в Table_2
Дата Код
05.02.2014----1
06.02.2014-----2
07.02.2014------3
08.02.2014-----4
09.02.2014------5
10.02.2014------6
11.02.2014-----7
...


Как вставить Код_1 с Table_1 и Код_даты с Table_2 в таблицу Table_3 с полями (Код_даты, Код_1)
так чтоб например код 1 каждые три дня, код 2 - два дня, три -пять итд.. Каждый код имеет свою стартовою дату и от нее идёт отсчёт. Если например взять стартовую для всех 05.02.2014 то результат:


Код_даты, Код_1
1----1
1----2
1----3
1-----4
3-----2
4-----1
4-----4
5-----2
6-----3
7-----1
7-----2
7-----4
6 фев 14, 00:36    [15525798]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на вставку данных с заданным диапазоном  [new]
o-o
Guest
Ulixes,
ну такое, например.
только это ли надо?
у меня сегодня полный отупизм, простите.
отвечаю только потому, что больше нет желающих

declare @Table_1 table(kod1 int, diap int);
insert into @Table_1 
values (1, 3), (2, 2), (3, 5), (4, 3);

declare @Table_2 table(dt datetime, kod1 int);
insert into @Table_2
values ('20140205', 1),
	 ('20140206', 2),
	 ('20140207', 3),
	 ('20140208', 4);
		
declare @res table (dt datetime, kod1 int);		
		
declare @kod int, @dt datetime, @kod1 int, @diap int;
declare @max_dt datetime = '20140425'

declare cur cursor local fast_forward for
	select t2.dt, t1.kod1, t1.diap
	from @Table_1 t1 join @Table_2 t2 on t1.kod1 = t2.kod1
	order by t2.dt, t1.kod1;

open cur;

fetch next from cur into @dt, @kod1, @diap;

while @@fetch_status = 0
begin
   ;with cte as 
   (select number as n
    from master..spt_values
    where type = 'P' and number % @diap = 0
          and dateadd(dd, number, @dt) <= @max_dt
   )
   insert into @res (dt, kod1)
   select dateadd(dd, n, @dt), @kod1
   from cte;
   fetch next from cur into @dt, @kod1, @diap;
end;

close cur;
deallocate cur;

select *
from @res
6 фев 14, 18:54    [15530660]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на вставку данных с заданным диапазоном  [new]
Ulixes
Member

Откуда:
Сообщений: 18
o-o,

Спасибо большое что ответили, всё правильно. У меня ещо вопрос если не трудно. Как из етого зделать View или запрос чтоб можна было обновлять любую дату, и все коды с етой даты сдвигались по етому интервалу? Например я в середине списка оновил дату (несколько дат), то все остальние последующие даты, которые соответствуют етому (Код1) вели отсчет от нее. Как бы динамическое перестроение графика.

Код1 Диапазон
1-------2



Результат (res)
Дата код1
06.02.2014 ----1
07.02.2014---- 2
08.02.2014 ----1
09.02.2014-----5
10.02.2014 ----1




Меняю 08.02.2014 на 09.02.2014

Результат (res)
Дата код1
06.02.2014 ----1
07.02.2014---- 2
09.02.2014 ----1 +
09.02.2014-----5
10.02.2014 ----
11.02.2014 ----1 +
7 фев 14, 00:47    [15531779]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на вставку данных с заданным диапазоном  [new]
Glory
Member

Откуда:
Сообщений: 104760
Ulixes
Как из етого зделать View или запрос

Никак

Ulixes
чтоб можна было обновлять любую дату, и все коды с етой даты сдвигались по етому интервалу? Например я в середине списка оновил дату (несколько дат), то все остальние последующие даты, которые соответствуют етому (Код1) вели отсчет от нее. Как бы динамическое перестроение графика.

Пишите для таблицы триггер(а). Который(ые) будут пересчитывать ваш график
7 фев 14, 10:16    [15532696]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на вставку данных с заданным диапазоном  [new]
Ulixes
Member

Откуда:
Сообщений: 18
Glory
Пишите для таблицы триггер(а). Который(ые) будут пересчитывать ваш график

Я в тригерах не очень розбираюсь, да и алгоритма не знаю как пересчитывать.Кто нибуть может помоч написать такой тригер, если нетрудно?
7 фев 14, 13:45    [15534357]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на вставку данных с заданным диапазоном  [new]
Glory
Member

Откуда:
Сообщений: 104760
Ulixes
да и алгоритма не знаю как пересчитывать.

А предложенный вам код что тогда есть ?
7 фев 14, 13:48    [15534382]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на вставку данных с заданным диапазоном  [new]
Ulixes
Member

Откуда:
Сообщений: 18
Glory
Ulixes
да и алгоритма не знаю как пересчитывать.

А предложенный вам код что тогда есть ?

Согласен.
Но как из него триггер сделать не пойму( Нужно вести отсчет от тех дат которые изменились и двигать все последующие.
7 фев 14, 14:06    [15534547]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на вставку данных с заданным диапазоном  [new]
Glory
Member

Откуда:
Сообщений: 104760
Ulixes
Но как из него триггер сделать не пойму

Триггер - это код, который автоматически запускается при каких действиях над таблицей
На этом собственно и заканчиваются его основные отличия от других программных объектов

Ulixes
Нужно вести отсчет от тех дат которые изменились и двигать все последующие.

пересчитайте _все_
7 фев 14, 14:12    [15534603]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на вставку данных с заданным диапазоном  [new]
Ulixes
Member

Откуда:
Сообщений: 18
Create trigger rew  on Table_2

After update

AS
BEGIN

declare @Table_1 table(kod1 int, diap int);
insert into @Table_1 (kod1 , diap )
select kod1, diap  from Table_1 ;

declare @Table_2 table(dt datetime, kod1 int);
insert into @Table_2 (dt, kod1)
select дата, kod1 from   View_изменения ;
		
declare @res table (dt datetime, kod1 int);		
		
declare @kod int, @dt datetime, @kod1 int, @diap int;
declare @max_dt datetime = '20140425'

declare cur cursor local fast_forward for
	select t2.dt, t1.kod1, t1.diap
	from @Table_1 t1 join @Table_2 t2 on t1.kod1 = t2.kod1
	order by t2.dt, t1.kod1;

open cur;

fetch next from cur into @dt, @kod1, @diap;

while @@fetch_status = 0
begin
   ;with cte as 
   (select number as n
    from master..spt_values
    where type = 'P' and number % @diap = 0
          and dateadd(dd, number, @dt) <= @max_dt
   )
   insert into @res (dt, kod1)
   select dateadd(dd, n, @dt), @kod1
   from cte;
   fetch next from cur into @dt, @kod1, @diap;
end;

close cur;
deallocate cur;

Update Table_2 set Table_2.дата=dt
from @res inner joinTable_2 on  @res.kod1=Table_2.kod1
where Table_2.дата>Table_2.inserted

end



Сделал так, выдает выдает ошибку: Msg 137, Level 16, State 1, Procedure rew, Line 48
Must declare the scalar variable "@res".
7 фев 14, 15:28    [15535242]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на вставку данных с заданным диапазоном  [new]
Glory
Member

Откуда:
Сообщений: 104760
Это что за отсебятина в конце ?
Update Table_2 set Table_2.дата=dt
from @res inner joinTable_2 on @res.kod1=Table_2.kod1
where Table_2.дата>Table_2.inserted

Почему триггер на Table_2 , если данные меняются в Table_1 ?
7 фев 14, 15:32    [15535277]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на вставку данных с заданным диапазоном  [new]
Ulixes
Member

Откуда:
Сообщений: 18
Glory
Это что за отсебятина в конце ?
Update Table_2 set Table_2.дата=dt
from @res inner joinTable_2 on @res.kod1=Table_2.kod1
where Table_2.дата>Table_2.inserted

Почему триггер на Table_2 , если данные меняются в Table_1 ?


Таблица Table_2 - данные из @res помещение в нее до изменений даты. Дале я меняю дату в ней и находжу изменения, вставляю в @Table_2
потом пересчитую с даты в @Table_2 и оновляю Table_2 .
7 фев 14, 15:45    [15535367]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на вставку данных с заданным диапазоном  [new]
Ulixes
Member

Откуда:
Сообщений: 18
Подскажите пожалуйста как сделать тригер который сдвигает даты?

Код1 Диапазон
1-------2



Результат (res)
Дата код1
06.02.2014 ----1
07.02.2014---- 2
08.02.2014 ----1
09.02.2014-----5
10.02.2014 ----1




Меняю 08.02.2014 на 09.02.2014

Результат (res)
Дата код1
06.02.2014 ----1
07.02.2014---- 2
09.02.2014 ----1 +
09.02.2014-----5
10.02.2014 ----
11.02.2014 ----1 +
7 фев 14, 19:38    [15536682]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить