Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.12.2011, 12:46   #1
luiszevs
 
Регистрация: 05.06.2010
Сообщений: 3
Восклицание сложный SQL update

доброе время суток форумчане!
нужна ваша помощь в написании апдейта SQL .
вот скрипт формирования таблицы:

create table #info (
PlayerNumber nvarchar(30),
[Days] int,
Capital money,
PrincipalAmount money,
ContractAmount money,
PaymentNumber int
)

insert into #info
select '2',31,0,0,5000,1

insert into #info
select '2',30,0,0,5000,2

insert into #info
select '2',29,120,0,5000,3

insert into #info
select '2',30,50,0,5000,4

insert into #info
select '2',31,70,0,5000,5

insert into #info
select '2',30,200,0,5000,6

insert into #info
select '7',31,0,0,5000,1

insert into #info
select '7',30,0,0,5000,2

insert into #info
select '7',29,120,0,5000,3

insert into #info
select '7',30,50,0,5000,4

insert into #info
select '7',31,70,0,5000,5

insert into #info
select '7',30,200,0,5000,6

select * from #info


теперь собственно описание проблемы:
значение поля PrincipalAmount должно быть следующим : в том случае когда PaymentNumber=1 тогда PrincipalAmount=ContractAmount-Capital .
во всех последующих случаях формула подсчёта такова : предыдущее значение PrincipalAmount-Capital(текущее значение) ...... тоесть на примере моей таблицы PlayerNumber=2,PaymentNumber=4 ....в этом случае значение PrincipalAmount должно быть: (select PrincipalAmount from #info where PlayerNumber=2 and PaymentNumber=3) - (select Capital from #info where PlayerNumber=2 and PaymentNumber=4) .... логика в общем такова.... вопрос в том как написать update чтобы все значения поля PrincipalAmount обновились таким образом.....(количество различных PlayerNumber может быть больше 100). всем заранее спасибо за помощь.
Изображения
Тип файла: jpg Capture.JPG (35.6 Кб, 128 просмотров)
luiszevs вне форума Ответить с цитированием
Старый 18.12.2011, 13:06   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

В предположении, что нумерация в PaymentNumber отдельна для каждого значения PlayerNumber и без пропущенных номеров. Разбил на два. Можно и одним с конструкцией CASE WHEN, без отладки не стал рисовать
Код:
UPDATE #info
  SET PrincipalAmount=PaymentNumber THEN ContractAmount-Capital
  WHERE PaymentNumber=1

UPDATE #info
  SET PrincipalAmount=(SELECT T.PrincipalAmount FROM #info T 
    WHERE T.PaymentNumber=#info.PaymentNumber-1 AND 
          T.PlayerNumber=#info.PlayerNumber)-Capital
  WHERE PaymentNumber>1
ADD

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

Последний раз редактировалось Аватар; 18.12.2011 в 13:15.
Аватар вне форума Ответить с цитированием
Старый 18.12.2011, 13:17   #3
luiszevs
 
Регистрация: 05.06.2010
Сообщений: 3
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
В предположении, что нумерация в PaymentNumber отдельна для каждого значения PlayerNumber и без пропущенных номеров. Разбил на два. Можно и одним с конструкцией CASE WHEN, без отладки не стал рисовать
Код:
UPDATE #info
  SET PrincipalAmount=PaymentNumber THEN ContractAmount-Capital
  WHERE PaymentNumber=1

UPDATE #info
  SET PrincipalAmount=(SELECT T.PrincipalAmount FROM #info T 
    WHERE T.PaymentNumber=#info.PaymentNumber-1 AND 
          T.PlayerNumber=#info.PlayerNumber)-Capital
  WHERE PaymentNumber>1
спасибо АВАТАР за столь оперативный ответ.
к сожалению этот метод не подходит,он не отнимает от предыдущего значения Principal вот скриншот резалт грида.......

нумерация в PaymentNumber отдельная и последовательная(без пропущенных номеров ) для каждого игрока ....
Изображения
Тип файла: jpg Capture2.JPG (60.0 Кб, 129 просмотров)
luiszevs вне форума Ответить с цитированием
Старый 18.12.2011, 13:25   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Попробуйте с курсором, если не наделал ошибок
Код:
DECLARE @PlayerNumber nvarchar(30),
        @PaymentNumber int
DECLARE Cursor1 CURSOR FOR
  SELECT PlayerNumber,PaymentNumber FROM #info ORDER BY PlayerNumber,PaymentNumber
OPEN Cursor1
FETCH Cursor1 INTO @PlayerNumber,@PaymentNumber
WHILE @@FETCH_STATUS=0 BEGIN
  IF @PaymentNumber=1
    UPDATE #info
      SET PrincipalAmount=ContractAmount-Capital
      WHERE PaymentNumber=1 AND PlayerNumber=@PlayerNumber
  ELSE
    UPDATE #info
      SET PrincipalAmount=(SELECT T.PrincipalAmount FROM #info T
        WHERE T.PaymentNumber=@PlayerNumber-1 AND
              T.PlayerNumber=@PlayerNumber)-Capital
      WHERE PaymentNumber=@PaymentNumber AND PlayerNumber=@PlayerNumber
  FETCH Cursor1 INTO @PlayerNumber,@PaymentNumber
END
CLOSE Cursor1
DEALLOCATE Cursor1
Это подойдет если у вас MS SQL
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 18.12.2011 в 13:50.
Аватар вне форума Ответить с цитированием
Старый 18.12.2011, 13:53   #5
luiszevs
 
Регистрация: 05.06.2010
Сообщений: 3
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Попробуйте с курсором, если не наделал ошибок
Код:
DECLARE @PlayerNumber nvarchar(30),
        @PaymentNumber int
DECLARE Cursor1 CURSOR FOR
  SELECT PlayerNumber,PaymentNumber FROM #info ORDER BY PlayerNumber,PaymentNumber
OPEN Cursor1
FETCH Cursor1 INTO @PlayerNumber,@PaymentNumber
WHILE @@FETCH_STATUS=0 BEGIN
  IF @PaymentNumber=1
    UPDATE #info
      SET PrincipalAmount=ContractAmount-Capital
      WHERE PaymentNumber=1 AND PlayerNumber=@PlayerNumber
  ELSE
    UPDATE #info
      SET PrincipalAmount=(SELECT T.PrincipalAmount FROM #info T
        WHERE T.PaymentNumber=@PlayerNumber-1 AND
              T.PlayerNumber=@PlayerNumber)-Capital
      WHERE PaymentNumber=@PaymentNumber AND PlayerNumber=@PlayerNumber
  FETCH Cursor1 INTO @PlayerNumber,@PaymentNumber
END
CLOSE Cursor1
DEALLOCATE Cursor1
Это подойдет если у вас MS SQL
огромное спасибо
подправил " WHERE T.PaymentNumber=@PlayerNumber-1 "
на " WHERE T.PaymentNumber=@PaymentNumber-1 " и всё работает как часы ещё раз спасибо за оперативную помощь
luiszevs вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
UPDATE sql hunter03 Помощь студентам 5 14.12.2011 18:00
SQL UPDATE MAZADA БД в Delphi 0 13.07.2011 13:38
Сложный запрос в SQL A-Lex-Is SQL, базы данных 1 10.08.2010 23:19
сложный sql запрос kate158 БД в Delphi 0 18.09.2008 11:38
Сложный SQL-запрос ole777 БД в Delphi 1 08.05.2007 20:56