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

Откуда: Санкт-Петербург
Сообщений: 322
Добрый день.

Пишу запрос:

UPDATE tblCash SET AmountGross = (SELECT IsNull(SUM(AmountIn), 0) - IsNull(SUM(AmountOut), 0) FROM tblCash WHERE ID < tblCash.ID)


Не работает.
В чем причина? Подскажите, пожалуйста.
FAQ по теме "Нарастающий итог" посмотрел, но я хочу одним запросом это сделать (одой SQL командой), возможно ли это?

Заранее спасибо.
29 май 12, 13:02    [12631215]     Ответить | Цитировать Сообщить модератору
 Re: Пытаюсь обновить числовое поле, записав в него нарастающий итог  [new]
Glory
Member

Откуда:
Сообщений: 104751
Игорь1973
Не работает.

Это сообщение об ошибке у вас такое ?

Игорь1973
FAQ по теме "Нарастающий итог" посмотрел, но я хочу одним запросом это сделать (одой SQL командой), возможно ли это?

В FAQ это и делается одной командой
29 май 12, 13:04    [12631230]     Ответить | Цитировать Сообщить модератору
 Re: Пытаюсь обновить числовое поле, записав в него нарастающий итог  [new]
Игорь1973
Member

Откуда: Санкт-Петербург
Сообщений: 322
Уточняю немножко свой SQL:

UPDATE tblCash SET AmountGross = (SELECT IsNull(SUM(AmountIn), 0) - IsNull(SUM(AmountOut), 0) FROM tblCash WHERE ID <= tblCash.ID)


Т.е. я хочу обновить сразу всю таблицу, абсолютно все значения в поле AmountGross, где нарастающий итог.
Поле AmountIn - это "Сумма прихода", поле AmountOut - "Сумма расхода".
29 май 12, 13:05    [12631245]     Ответить | Цитировать Сообщить модератору
 Re: Пытаюсь обновить числовое поле, записав в него нарастающий итог  [new]
Игорь1973
Member

Откуда: Санкт-Петербург
Сообщений: 322
Честно говоря, я не понимаю выражения с двумя знаками равенства.

update #t set @tot_sum = tot_sum = @tot_sum + ISNULL(sum1, 0)


Это назначение сразу двум переменным?
Мне нужен запрос, который бы работал и для Access2000, т.е. не T-SQL с переменной, а что-то вроде моего выражения.
Кроме того, поля Приход и Расход в моем случае это разные поля, а не "все в одном".
29 май 12, 13:17    [12631363]     Ответить | Цитировать Сообщить модератору
 Re: Пытаюсь обновить числовое поле, записав в него нарастающий итог  [new]
Glory
Member

Откуда:
Сообщений: 104751
Игорь1973
Мне нужен запрос, который бы работал и для Access2000, т.е. не T-SQL

Почему вопрос тогда задаете здесь, а не в форуме по Access ?
29 май 12, 13:25    [12631442]     Ответить | Цитировать Сообщить модератору
 Re: Пытаюсь обновить числовое поле, записав в него нарастающий итог  [new]
Игорь1973
Member

Откуда: Санкт-Петербург
Сообщений: 322
Конструкции вида UPDATE Table SET Field = (select ...) в Access не работают, а в MS SQL работают.
Так вот я хочу построить именно такую конструкцию - одно выражение SQL вида UPDATE ... SET.
Пусть оно будет работать только под MS SQL Server, а его поддержку для Access я уже планирую реализовать на уровне приложения.

Ну, может быть, если кто-то что-то универсальное предложит и для Access рабочее - буду приятно удивлен. Хотя конечно, предполагаю, что врят-ли тут что-то можно поделать.

Кстати говоря, хранить и приход и расход в одном поле менее удобно. Лучше в разных, удобнее считать обороты отдельно по приходу и по расходу. Зайдите в любой клиент-банк, там нынче везде раздельно. Так что ваш вопрос в ФАКе, может быть, лучше и подкорректировать.
29 май 12, 13:35    [12631522]     Ответить | Цитировать Сообщить модератору
 Re: Пытаюсь обновить числовое поле, записав в него нарастающий итог  [new]
Glory
Member

Откуда:
Сообщений: 104751
Игорь1973
Пусть оно будет работать только под MS SQL Server

В FAQ есть 2 работающих способа
Чем они вас не устраивают ?
29 май 12, 13:38    [12631560]     Ответить | Цитировать Сообщить модератору
 Re: Пытаюсь обновить числовое поле, записав в него нарастающий итог  [new]
Glory
Member

Откуда:
Сообщений: 104751
Игорь1973
Кстати говоря, хранить и приход и расход в одном поле менее удобно. Лучше в разных, удобнее считать обороты отдельно по приходу и по расходу. Зайдите в любой клиент-банк, там нынче везде раздельно. Так что ваш вопрос в ФАКе, может быть, лучше и подкорректировать.

Вопрос в ФАКе рассказывает о способе получения нарастающего итого.
А не о том, какая стркутура оптимальнее подходит для хранения приходов и расходов
29 май 12, 13:40    [12631582]     Ответить | Цитировать Сообщить модератору
 Re: Пытаюсь обновить числовое поле, записав в него нарастающий итог  [new]
Игорь1973
Member

Откуда: Санкт-Петербург
Сообщений: 322
Я запрашиваю то, что нужно мне, но вы мне почему-то твердо предлагаете то, что есть у вас. Спасибо, но мне это не надо.
Я лишь сказал о том, что ваш "способ получения" на не типичном примере. Если бы вы были бухгалтером или миллионером :), то чаще захаживали бы в различные клиент-банки...
Всего хорошего!
29 май 12, 14:02    [12631752]     Ответить | Цитировать Сообщить модератору
 Re: Пытаюсь обновить числовое поле, записав в него нарастающий итог  [new]
f070214
Member

Откуда:
Сообщений: 35
Игорь1973, а вы бухгалтер или миллионер? :) У меня вот клиент-банк отражает приход / расход в одном столбце. Ваш пример не показателен, более того, если в клиент-банке данные отображаются в одном столбце, это вовсе не означает, что они так же хранятся в таблице.
29 май 12, 14:12    [12631852]     Ответить | Цитировать Сообщить модератору
 Re: Пытаюсь обновить числовое поле, записав в него нарастающий итог  [new]
pegoopik
Member

Откуда: Новосибирск
Сообщений: 54
Игорь1973,

Поможет?

Скрипт:
CREATE TABLE tblCash (
  ID INT,
  AmountIn INT,
  AmountOut INT,
  AmountGross INT
)
GO
INSERT INTO tblCash
  SELECT * FROM(VALUES 
    (1,100,10,NULL),
    (2,100,10,NULL),
    (3,100,10,NULL),
    (4,100,10,NULL),
    (5,100,10,NULL),
    (6,100,10,NULL),
    (7,100,10,NULL)
  )x(a,b,c,d)
GO
SELECT * FROM tblCash
GO
UPDATE tblCash SET AmountGross = 
(SELECT 
  IsNull(SUM(T.AmountIn), 0) - IsNull(SUM(T.AmountOut), 0) 
  FROM tblCash T 
  WHERE tblCash.ID >= T.ID
)
GO
SELECT * FROM tblCash
GO
DROP TABLE tblCash
GO

Результат:

IDAmountInAmountOutAmountGross
110010NULL
210010NULL
310010NULL
410010NULL
510010NULL
610010NULL
710010NULL

IDAmountInAmountOutAmountGross
11001090
210010180
310010270
410010360
510010450
610010540
710010630
29 май 12, 14:19    [12631905]     Ответить | Цитировать Сообщить модератору
 Re: Пытаюсь обновить числовое поле, записав в него нарастающий итог  [new]
Glory
Member

Откуда:
Сообщений: 104751
Игорь1973
Я запрашиваю то, что нужно мне, но вы мне почему-то твердо предлагаете то, что есть у вас.

Вы даже не можете толком объяснить фразу "Не работает."
А начинаете учить, про бухгалтеров и миллионеров
29 май 12, 14:22    [12631928]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить