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

пытаюсь выполнить обновление данных таким запросом:

update putlist set petrolstart = (select petrolend from putlist where driver=8 and numlist = numlist-1), petrolend = (select petrolend from putlist where driver=8 and numlist = numlist-1) - petrolroad - petrolcity + zapravka where driver=8 and numlist > 25


при выполнении выдает ошибку что petrolstart не может быть null, как я понял он не видит предыдущую строку из которой нужно взять данные.
Подскажите как можно решить эту проблему и выполнить запрос?
7 авг 14, 17:11    [16413197]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
Glory
Member

Откуда:
Сообщений: 104751
guset
как я понял он не видит предыдущую строку из которой нужно взять данные.

Он говорит, что в поле petrolstart запрещено записывать null-ы

guset
Подскажите как можно решить эту проблему и выполнить запрос?

Написать запросы так, чтобы они не возвращали null-ы
7 авг 14, 17:14    [16413214]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
Mairos
Member

Откуда:
Сообщений: 555
guset,
update putlist 
set petrolstart = isnull((select petrolend from putlist where driver=8 and numlist = numlist-1),0), 
petrolend = isnull((select petrolend from putlist where driver=8 and numlist = numlist-1),0) - isnull(petrolroad,0) - isnull(petrolcity,0) + isnull(zapravka,0) 
where driver=8 and numlist > 25
7 авг 14, 17:31    [16413355]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
guset
Guest
Mairos,

Спасибо, но вы неправильно поняли, дело в том, что данные должны взяться из предыдущей строки и данные там есть, но видимо в запросе их просто не видно так как стоит ограничение numlist > 24, т.е. данные в 24 откуда он их должен взять он не видит.
Проверку условия на null я прекрасно знаю как выполнить, но там нет ни одного null все поля заполнены и мне не нужно возвращать 0 если null мне нужно взять данные с предыдущей строки
7 авг 14, 17:37    [16413396]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
_djХомяГ
Guest
Значит вы неправильно написали запрос вытягивающие данные с предыдущей строки
Кажется вам давали подсказку в соседнем треде о необходимости использования ранжирующих ф-ций и CROSS/OUTER APPLY
7 авг 14, 17:40    [16413407]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
Glory
Member

Откуда:
Сообщений: 104751
guset
что данные должны взяться из предыдущей строки

А у вас все строки пронумерованы чтоли ? Чтобы сервер понял, какая из предыдущая
7 авг 14, 17:46    [16413441]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
guset
Guest
Glory,

Не хотел усложнять описание, но видимо придется, данные берутся не из предыдущей строки, а из предыдущего путевого листа условие

where driver=8 and numlist = numlist-1


как раз задает предыдущий путевой лист этого водителя, но так как в самом апдейте стоит ограничение numlist > 25 то данные из 25 листа он видимо просто не видит, во всяком случае это так понимаю я, потому данные там есть, это точно...
7 авг 14, 17:50    [16413461]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8839
guset, у вас последовательность номеров гарантированно не имеет дырок, и о, чудо чудесное, не находится numlist-1?
7 авг 14, 18:02    [16413525]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
guset
Guest
Владислав Колосов,

ага возможно, завтра проверю, но дырки маловероятны
7 авг 14, 18:09    [16413540]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
Glory
Member

Откуда:
Сообщений: 104751
guset
numlist = numlist-1

А вы считаете, что два одинаково написанных поля непременно должны браться из разных записей ???
Ваш подзапрос эквивалентент условию numlist рано самоу себе же минус 1
7 авг 14, 21:41    [16414257]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
guset
Guest
Glory,

Да мне так и нужно, так и подразумевалось, что numlist равно самому себе же минус 1, что бы взять данные с предыдущего листа.
Кстати, проверил, дырок в номерах листов нет. А если выполнить запрос:

select numlist,
(select PetrolEnd from buhlist where Driver = 8 and NumList = NumList-1), 
(select PetrolEnd from buhlist where Driver = 8 and NumList = NumList-1) - PetrolCity - PetrolRoad + isnull (Zapravka,0) from PutList
where Driver = 8 and NumList > 38 and NumList < 60


то в результате будут одни NULL

39 NULL NULL
40 NULL NULL
41 NULL NULL
42 NULL NULL
43 NULL NULL
44 NULL NULL
45 NULL NULL
46 NULL NULL
47 NULL NULL
48 NULL NULL
50 NULL NULL
51 NULL NULL
52 NULL NULL
8 авг 14, 07:10    [16415035]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
mrGuest
Guest
guset
Да мне так и нужно, так и подразумевалось, что numlist равно самому себе же минус 1


Ну как же Вы не понимаете...

declare @t table (a int)
insert into @t(a) values(1)
select * from @t where a = a - 1


Запрос по определению не может ничего вернуть, потому что в одной строке таблицы, в каждом столбце хранится единственное значение.

В приведенном примере, в таблице одна строка, содержащая значение 1 в поле "а". А значит запрос равносилен:
select * from @t where 1 = 1 - 1


Если уж Вы хотите пойти таким путем, то необходимо получить таблицу являющуюся объединением таблицы @t с самой собой. А при объединении связать строки разных таблиц с учетом сдвига.
8 авг 14, 09:01    [16415178]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
guset
Glory,

Да мне так и нужно, так и подразумевалось, что numlist равно самому себе же минус 1, что бы взять данные с предыдущего листа.
Кстати, проверил, дырок в номерах листов нет. А если выполнить запрос:

select numlist,
(select PetrolEnd from buhlist where Driver = 8 and NumList = NumList-1), 
(select PetrolEnd from buhlist where Driver = 8 and NumList = NumList-1) - PetrolCity - PetrolRoad + isnull (Zapravka,0) from PutList
where Driver = 8 and NumList > 38 and NumList < 60



то в результате будут одни NULL

39 NULL NULL
40 NULL NULL
41 NULL NULL
42 NULL NULL
43 NULL NULL
44 NULL NULL
45 NULL NULL
46 NULL NULL
47 NULL NULL
48 NULL NULL
50 NULL NULL
51 NULL NULL
52 NULL NULL
Расставьте алиасы таблиц у всех полей.
Иначе в подзапросе все поля относятся к внутренней PutList
8 авг 14, 09:07    [16415203]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
Mairos
Member

Откуда:
Сообщений: 555
guset, вроде бы в 2012 версии сервера есть уже LAG и LEAD - возврат предыдущего и последующего значений. В Oracle я ими пользовался , а вот в MS SQL пока нет.
[url=]http://msdn.microsoft.com/ru-ru/library/hh231256(v=sql.110).aspx[/url]

Пример оттуда
CREATE TABLE T (a int, b int, c int); 
GO
INSERT INTO T VALUES (1, 1, -3), (2, 2, 4), (3, 1, NULL), (4, 3, 1), (5, 2, NULL), (6, 1, 5); 

SELECT b, c, 
    LAG(2*c, b*(SELECT MIN(b) FROM T), -c/2.0) OVER (ORDER BY a) AS i
FROM T;
8 авг 14, 09:47    [16415313]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
Wlr-l
Member

Откуда:
Сообщений: 606
В каждом наборе "последовательных" строк всегда найдется одна, у которой не будет предыдущей, и найдется одна, у которой не будет следующей, следовательно, по крайней мере для двух строк этого набора подзапросы (или LAG и LEAD) вернут null, даже если в последовательности не будет дырок.
8 авг 14, 13:49    [16417195]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
o-o
Guest
Wlr-l,

на случай "предыдущей/следующей нет" у функций LEAD\LAG имеется параметр default,
вписать можно, что душе угодно:

LAG (scalar_expression [,offset] [,default])
OVER ( [ partition_by_clause ] order_by_clause )

default

The value to return when scalar_expression at offset is NULL. If a default value is not specified, NULL is returned. default can be a column, subquery, or other expression, but it cannot be an analytic function. default must be type-compatible with scalar_expression.
8 авг 14, 14:17    [16417425]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
Wlr-l
Member

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

Я озвучил ситуацию, а как из нее выходить это ТС решит.
8 авг 14, 15:28    [16418076]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
o-o
Guest
Wlr-l,

не-а.
вы написали, что "LAG и LEAD) вернут null"
неправильное озвучивание ситуации.
что попросите, то и вернут, не оставляйте пустым третий параметр и никаких null-ов не будет
8 авг 14, 15:34    [16418146]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
Wlr-l
Member

Откуда:
Сообщений: 606
o-o,
Ваше уточнение для LAG и LEAD принимается, я не досказал.

Если внимательно прочитать написанное ранее, то ТС уверен, что у каждой строки всегда есть предыдущая, даже убедился, что в своей последовательности нет дырок. На предложение Mairos использовать isnull он ответил "там нет ни одного null все поля заполнены и мне не нужно возвращать 0 если null мне нужно взять данные с предыдущей строки". Поэтому я опустил параметр [,default] и подчеркиваю, что делать с null должен решить ТС.
8 авг 14, 16:50    [16418785]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить