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

Откуда:
Сообщений: 839
есть запрос
set dateformat dmy
declare @OnDate date='07.02.2012'
if OBJECT_ID('tempdb..#tmp') is not null drop TABLE #tmp
create table #tmp (docdate date,docsum decimal(19,4),delsum decimal(19,4))
insert into #tmp
values ('07.02.2012',8753.66,5400),
	 ('08.02.2012',-7500,null),
         ('15.02.2012',15400,null),
         ('16.02.2012',-3000,null)
 /*
    update t
 		set delsum=DocSum+(select top 1 delsum from #tmp where DocDate<t.docdate order by DocDate desc )
 
    from #tmp t 
    where docdate<> @OnDate
 */
    update t
 		set delsum=DocSum+(select delsum from #tmp where DocDate=(
    		select max(docdate) from #tmp where docdate<t.docdate))
 
    from #tmp t 
    where docdate<> @OnDate 	
     
     
    select * from #tmp
    
    drop table #tmp


надо получить
docdate docsum delsum
07.02.2012 8753.66 5400
08.02.2012 -7500 -2100
15.02.2012 15400 13300
16.02.2012 -3000 10300

вроде элементарно...и не могу понять почему мой запрос не работает и выдает
docdate docsum delsum
07.02.2012 8753.66 5400
08.02.2012 -7500 -2100
15.02.2012 15400 null
16.02.2012 -3000 null
17 фев 12, 11:33    [12108183]     Ответить | Цитировать Сообщить модератору
 Re: помогите плиз с запросом sql server 2008r2  [new]
Glory
Member

Откуда:
Сообщений: 104751
ther
вроде элементарно...и не могу понять почему мой запрос не работает и выдает

Наверное потому, что null+что-то дает в результате null
17 фев 12, 11:36    [12108218]     Ответить | Цитировать Сообщить модератору
 Re: помогите плиз с запросом sql server 2008r2  [new]
ther
Member

Откуда:
Сообщений: 839
Glory
да..но если добавить isnull то получится результат
docdate docsum delsum
2012-02-07 8753.66 5400
2012-02-08 -7500 -2100
2012-02-15 15400 15400
2012-02-16 -3000 -3000

с нулом то я баловался..меня интересует почему начиная с 15.02.2012 идет этот самый null
17 фев 12, 11:39    [12108255]     Ответить | Цитировать Сообщить модератору
 Re: помогите плиз с запросом sql server 2008r2  [new]
Glory
Member

Откуда:
Сообщений: 104751
ther
меня интересует почему начиная с 15.02.2012 идет этот самый null

Еще раз - потому что null+что-то дает null
17 фев 12, 11:42    [12108280]     Ответить | Цитировать Сообщить модератору
 Re: помогите плиз с запросом sql server 2008r2  [new]
ther
Member

Откуда:
Сообщений: 839
Glory
вот упрямый вы))
сформулирую по другому..почему для даты 15.02.2012 значение null а не -2100?

и как тогда сделать правильно?
17 фев 12, 11:44    [12108300]     Ответить | Цитировать Сообщить модератору
 Re: помогите плиз с запросом sql server 2008r2  [new]
Glory
Member

Откуда:
Сообщений: 104751
ther
вот упрямый вы))
сформулирую по другому..почему для даты 15.02.2012 значение null а не -2100?

Мда
5400 + -7500 сколько будет ?
А 15400 + null ?
А -3000 + null ?
17 фев 12, 11:46    [12108315]     Ответить | Цитировать Сообщить модератору
 Re: помогите плиз с запросом sql server 2008r2  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5124
ther
сформулирую по другому..почему для даты 15.02.2012 значение null а не -2100?

просто посмотрите, что у вас вернёт вот это:
(select delsum from #tmp where DocDate=(select max(docdate) from #tmp where docdate<t.docdate))
для '15.02.2012'
17 фев 12, 11:49    [12108347]     Ответить | Цитировать Сообщить модератору
 Re: помогите плиз с запросом sql server 2008r2  [new]
ther
Member

Откуда:
Сообщений: 839
Glory
ther
вот упрямый вы))
сформулирую по другому..почему для даты 15.02.2012 значение null а не -2100?

Мда
5400 + -7500 сколько будет ?
А 15400 + null ?
А -3000 + null ?

это понятно..но запрос выбирает значение delsum из записи дата которой максимальна но меньше текущей..то есть по идее должно же быть не 15400 + null ? а 15400 + -2100?
помогите тогда запросом плиз..может я действительно не прав и запрос откроет глаза
17 фев 12, 11:52    [12108378]     Ответить | Цитировать Сообщить модератору
 Re: помогите плиз с запросом sql server 2008r2  [new]
Glory
Member

Откуда:
Сообщений: 104751
ther
это понятно..но запрос выбирает значение delsum из записи дата которой максимальна но меньше текущей..то есть по идее должно же быть не 15400 + null ? а 15400 + -2100?

Откуда там будет -2100 то ?
Или вы думаете, что изменения update сразу видны в вашем же запросе ?
Ну так вы глубоко заблуждаетесь.
17 фев 12, 11:54    [12108403]     Ответить | Цитировать Сообщить модератору
 Re: помогите плиз с запросом sql server 2008r2  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5124
-2100 не будет полюбому ибо для 8-го нет дат меньше
17 фев 12, 11:55    [12108416]     Ответить | Цитировать Сообщить модератору
 Re: помогите плиз с запросом sql server 2008r2  [new]
ther
Member

Откуда:
Сообщений: 839
Дедушка
(select delsum from #tmp where DocDate=(select max(docdate) from #tmp where docdate<t.docdate))

docdate docsum delsum sm
2012-02-07 8753.66 5400 null
2012-02-08 -7500 -2100 5400
2012-02-15 15400 15400null
2012-02-16 -3000 -3000 null

но это и понятно так как запрос не работает...но я просто не могу понять почему такой результат
но если подставить дату то выходит
docdate docsum delsum sm dt
2012-02-07 8753.66 5400 null
2012-02-08 -7500 -2100 54002012-02-07
2012-02-15 15400 15400null 2012-02-08
2012-02-16 -3000 -3000 null2012-02-15
17 фев 12, 11:58    [12108453]     Ответить | Цитировать Сообщить модератору
 Re: помогите плиз с запросом sql server 2008r2  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5124
Дедушка
-2100 не будет полюбому ибо для 8-го нет дат меньше

вот это я поторопился, неправ
17 фев 12, 11:59    [12108462]     Ответить | Цитировать Сообщить модератору
 Re: помогите плиз с запросом sql server 2008r2  [new]
ther
Member

Откуда:
Сообщений: 839
Glory
ther
это понятно..но запрос выбирает значение delsum из записи дата которой максимальна но меньше текущей..то есть по идее должно же быть не 15400 + null ? а 15400 + -2100?

Откуда там будет -2100 то ?
Или вы думаете, что изменения update сразу видны в вашем же запросе ?
Ну так вы глубоко заблуждаетесь.

обрадовали(( а как тогда можно поступить?
17 фев 12, 11:59    [12108464]     Ответить | Цитировать Сообщить модератору
 Re: помогите плиз с запросом sql server 2008r2  [new]
Glory
Member

Откуда:
Сообщений: 104751
update t
		set delsum=DocSum+isnull((select sum(DocSum) from #tmp a where a.DocDate <t.docdate), 0.0)
from #tmp t 
17 фев 12, 12:14    [12108610]     Ответить | Цитировать Сообщить модератору
 Re: помогите плиз с запросом sql server 2008r2  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
ther,

проблема в том, что вы думаете что апдейт идет построчно, тогда как он работает со множеством.
как вариант, можно предварительно высчитать необходимые значения и потом обновить, вот, например:
set dateformat dmy
declare @OnDate date='07.02.2012'
if OBJECT_ID('tempdb..#tmp') is not null drop TABLE #tmp
create table #tmp (docdate date,docsum decimal(19,4),delsum decimal(19,4))
insert into #tmp
values ('07.02.2012',8753.66,5400),
	 ('08.02.2012',-7500,null),
         ('15.02.2012',15400,null),
         ('16.02.2012',-3000,null);
         
select * from #tmp;

with numbered as
(
	select *,rn=row_number() over(order by docdate) from #tmp
),
cte as
(
	select docdate,docsum,delsum,rn,delsumagg=convert(decimal(19,4),delsum) from numbered where delsum is not null
	union all
	select
		t.docdate,
		t.docsum,
		t.delsum,
		t.rn,
		delsumagg = convert(decimal(19,4), cte.delsumagg+t.docsum)
	from 
		cte
		join numbered t on t.rn-1 = cte.rn
			
)
update t
set t.delsum = cte.delsumagg
from
	#tmp t
	join cte on cte.docdate = t.docdate


select * from #tmp
drop table #tmp
17 фев 12, 12:20    [12108672]     Ответить | Цитировать Сообщить модератору
 Re: помогите плиз с запросом sql server 2008r2  [new]
ther
Member

Откуда:
Сообщений: 839
спасибо за советы...понял свою ошибку
17 фев 12, 13:06    [12109181]     Ответить | Цитировать Сообщить модератору
 Re: помогите плиз с запросом sql server 2008r2  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
ther,

вот кстати еще вариантик апдейта, без рекурсии
set dateformat dmy
declare @OnDate date='07.02.2012'
if OBJECT_ID('tempdb..#tmp') is not null drop TABLE #tmp
create table #tmp (docdate date,docsum decimal(19,4),delsum decimal(19,4))
insert into #tmp
values ('07.02.2012',8753.66,5400),
	 ('08.02.2012',-7500,null),
         ('15.02.2012',15400,null),
         ('16.02.2012',-3000,null);
         
select * from #tmp;

update t1
set	delsum = 
		(select top(1) delsum from #tmp where delsum is not null) + 
		isnull((select sum(docsum) from #tmp t2 where t2.docdate <= t1.docdate and t2.delsum is null),0)
from 
	#tmp t1


select * from #tmp
drop table #tmp
17 фев 12, 13:14    [12109268]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить