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

Откуда:
Сообщений: 1984
Таблица data. Данные в ней отсортированы по id и по дате
id|date|sum
01|2012-01-01|1000
01|2012-01-11|500
01|2012-01-21|300
02|2012-01-01|1000
02|2012-01-11|900
03|2012-01-11|100

Таблица Delta
id|sum
01|-1000
02|-600
03|100

Хочется получить:
id|date|sum
01|2012-01-01|800 (maxvalue(0, 1000-200=800)))
01|2012-01-11|0 (maxvalue(0, 500-700=-200)))
01|2012-01-21|0 (maxvalue(0, 300-1000=-700))
02|2012-01-01|1000
02|2012-01-11|300 (maxvalue(0, 900-600=300)))
03|2012-01-11|200 (maxvalue(0, 100+100=200)))

Другими словами. Берем из таблицы Data записи с идентификатором 1, упорядочиваем их по дате (1000, 500, 300). Необходимо выполнить уточнение в пределах суммы -1000. Начинаем уточнять с последнего числа 300. Получаем (800, 0, 0).

На ум приходят только курсоры. Может можно без них сделать?
10 дек 12, 09:19    [13604343]     Ответить | Цитировать Сообщить модератору
 Re: Помогите обновить данные таблиц  [new]
aleks2
Guest
__Avenger__
Хочется получить:
id|date|sum
01|2012-01-01|800 (maxvalue(0, 1000-200=800)))
01|2012-01-11|0 (maxvalue(0, 500-700=-200)))
01|2012-01-21|0 (maxvalue(0, 300-1000=-700))
02|2012-01-01|1000
02|2012-01-11|300 (maxvalue(0, 900-600=300)))
03|2012-01-11|200 (maxvalue(0, 100+100=200)))


Если ты напряжешься и перепишешь свой пример так

id|date|sum
01|2012-01-01|800 (maxvalue(0, (1000+500+300)-1000=800)))
01|2012-01-11|0 (maxvalue(0, (500+300) -1000=-200)))
01|2012-01-21|0 (maxvalue(0, (300) -1000=-700))

тибе, страдалец, сильно полегчает. И дурные мысли о курсорах покинут твои воспаленные мозги.
10 дек 12, 10:46    [13604744]     Ответить | Цитировать Сообщить модератору
 Re: Помогите обновить данные таблиц  [new]
__Avenger__
Member

Откуда:
Сообщений: 1984
create table #tData (ID int, Date DateTime, Summ Numeric(15,2))
insert into #tData 
select 01, '20120101', 1000 union all
select 01, '20120111', 500 union all
select 01, '20120121', 300 union all
select 02, '20120101', 1000 union all
select 02, '20120111', 900 union all
select 03, '20120111', 100

select * from #tData

create table #tDelta (ID int, Summ Numeric(15,2))
insert into #tDelta
select 01, -1000 union all
select 02, -600 union all
select 03, 100 

update #tData
???



drop table #tDelta
drop table #tData  


Все равно не понятно, как это сделать без курсоров.
10 дек 12, 11:14    [13604979]     Ответить | Цитировать Сообщить модератору
 Re: Помогите обновить данные таблиц  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
автор
Другими словами. Берем из таблицы Data записи с идентификатором 1, упорядочиваем их по дате (1000, 500, 300). Необходимо выполнить уточнение в пределах суммы -1000. Начинаем уточнять с последнего числа 300. Получаем (800, 0, 0).

Сорри конечно,НО ето по каким мат уранениям получаеться то ?
300-1000 =800 ??????
Вам надо последнюю адту общей суммой проапдейтить или как ?
10 дек 12, 12:00    [13605350]     Ответить | Цитировать Сообщить модератору
 Re: Помогите обновить данные таблиц  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Maxx,

Ему надо дельту постепенно прибавлять к значениям, при этом идти от самой поздней даты к самой ранней.

На первом шаге есть набор чисел (1000, 500, 300) и дельта -1000.
На втором шаге используем кусок дельты -300, остаётся набор (1000, 500, 0) и дельта -700.
На третьем шаге используем кусок дельты -500, остаётся набор (1000, 0, 0) и дельта -200.
На четвёртом шаге используем оставшуюся дельту, остаётся набор (200, 0, 0) и дельта 0.
Дельты не осталось, процесс завершается.
10 дек 12, 12:11    [13605432]     Ответить | Цитировать Сообщить модератору
 Re: Помогите обновить данные таблиц  [new]
Exproment
Member

Откуда:
Сообщений: 416
__Avenger__, как вариант, через рекурсивную CTE нет ничего сложного. Сответсственно читайте BOl, если что спрашивайте. Если такой вариант не нравится, то нужно подумать о внедрении дополнительной таблицы с дельтами.
10 дек 12, 13:34    [13606259]     Ответить | Цитировать Сообщить модератору
 Re: Помогите обновить данные таблиц  [new]
smallserg
Member

Откуда:
Сообщений: 82
__Avenger__
Таблица data. Данные в ней отсортированы по id и по дате
id|date|sum
01|2012-01-01|1000
01|2012-01-11|500
01|2012-01-21|300
02|2012-01-01|1000
02|2012-01-11|900
03|2012-01-11|100

Таблица Delta
id|sum
01|-1000
02|-600
03|100

Хочется получить:
id|date|sum
01|2012-01-01|800 (maxvalue(0, 1000-200=800)))
01|2012-01-11|0 (maxvalue(0, 500-700=-200)))
01|2012-01-21|0 (maxvalue(0, 300-1000=-700))
02|2012-01-01|1000
02|2012-01-11|300 (maxvalue(0, 900-600=300)))
03|2012-01-11|200 (maxvalue(0, 100+100=200)))


Если Вы объясните по какой логике должен произойти update 6-й
строки, но не должен - 4-ой, я, возможно, мог бы помочь.
12 дек 12, 10:17    [13617091]     Ответить | Цитировать Сообщить модератору
 Re: Помогите обновить данные таблиц  [new]
__Avenger__
Member

Откуда:
Сообщений: 1984
smallserg,

6-я строка, это строка с идентификатором 3. В таблице Delta у строки с ид=3, положительное приращение и =100. Положительные приращения просто прибавляются к сумме с максимальной датой. Т.е. 100+100=200.

id|date|sum
04|2012-01-10|100
04|2012-01-11|300

Таблица Delta
id|sum
04|1000

Результат:
04|2012-01-10|100
04|2012-01-11|1300
13 дек 12, 00:39    [13622999]     Ответить | Цитировать Сообщить модератору
 Re: Помогите обновить данные таблиц  [new]
__Avenger__
Member

Откуда:
Сообщений: 1984
Ну вот дошли руки до реализации, может проще можно:

create table #tData (ID int, Date DateTime, Summ Numeric(15,2))
insert into #tData 
select 01, '20120121', 300 union all
select 01, '20120111', 500 union all
select 01, '20120101', 1000 union all
select 02, '20120101', 1000 union all
select 02, '20120111', 900 union all
select 03, '20120111', 100

--select * from #tData

create table #tDelta (ID int, Summ Numeric(15,2))
insert into #tDelta
select 01, -1000 union all
select 02, -600 union all
select 03, 100 

;WITH tData AS (
    SELECT ID, Date, Summ, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Date DESC) AS RowID FROM #tData
  ), Tree AS (
    SELECT d.ID, d.Date, CAST(d.Summ + dl.Summ as Numeric(15,2)) AS Summ, d.RowID
    FROM tData d
    INNER JOIN #tDelta dl ON dl.ID = d.ID 
    WHERE d.RowID = 1 

    UNION ALL
    SELECT d.ID, d.Date, CAST(d.Summ + ISNULL(tr.Summ, 0) as Numeric(15,2)), d.RowID
    FROM tData d
    INNER JOIN Tree tr ON tr.ID = d.ID
      AND tr.RowID = d.RowID - 1
      AND tr.Summ < 0
  )


update #tData
  SET Summ = CASE WHEN t.Summ < 0 THEN 0 ELSE t.Summ END
from Tree t
where t.ID = #tData.ID
  and t.Date = #tData.Date 

SELECT * From #tData
order by id, Date desc


/*




declare @tot_sum numeric(15,2)


set @tot_sum = -1000

update #tData set
   @tot_sum = Summ = @tot_sum + Summ
from #tData
where id = 1 
order by Date

select * from #tData where id=1
*/

drop table #tDelta
drop table #tData  
24 дек 12, 23:50    [13680135]     Ответить | Цитировать Сообщить модератору
 Re: Помогите обновить данные таблиц  [new]
__Avenger__
Member

Откуда:
Сообщений: 1984
Никто не знает?
25 дек 12, 14:49    [13683232]     Ответить | Цитировать Сообщить модератору
 Re: Помогите обновить данные таблиц  [new]
__Avenger__
Member

Откуда:
Сообщений: 1984
проще можно?
25 дек 12, 14:49    [13683241]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить