Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите с запросом, SQL Server 2005 
V
    Опции темы
nextzi0
  Дата 3.8.2011, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 28.5.2008
Где: о. Корсика

Репутация: нет
Всего: нет



Всем привет. Есть допустим такая таблица t:
id value
1    4
2    5
3    7
4    8
5    8
6    3

и исходное число 0=<n<=8. Так вот, нужно организовать запрос, который бы "раскидывал" число n по значениям столбца value из t, начиная с самого меньшего значения, пока n не станет равным 0, причем требуется эту "раскидку" еще куда нибудь сохранить ( например в таблицу logs). 

В данном случае это выглядело бы как-то так:

записываем в logs 3(тройку) + id(6)
записываем в logs 4ку + id(1)
записываем в logs 1 + id(2)

в итоге с учетом таблиц t1 и logs (отдельный запрос) можно было бы посмотреть "остатки" значений t:
id ostatok
1  0
2  4
3  7
4  8
5  8
6  0

Можно такое средствами SQL организовать?
--------------------
Не бойся начинать что-то новое, помни, что ковчег построили любители - профессионалы построили "Титаник"
PM MAIL ICQ   Вверх
Akina
Дата 4.8.2011, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Ну можно... в процедуре или функции. Открыть курсор, сортированный по возрастанию value и последовательно обрабатывать записи до набора требуемой суммы.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
nextzi0
Дата 4.8.2011, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 28.5.2008
Где: о. Корсика

Репутация: нет
Всего: нет



Спасибо. Я как раз так и сделал. Просто не работал раньше с курсорами  smile 
--------------------
Не бойся начинать что-то новое, помни, что ковчег построили любители - профессионалы построили "Титаник"
PM MAIL ICQ   Вверх
Zloxa
Дата 4.8.2011, 10:28 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



орацле.
Код

SQL> create table test as (
  2   select 1 id,    4 value from dual
  3   union all select 2,    5 from dual
  4   union all select 3,    7 from dual
  5   union all select 4,    8 from dual
  6   union all select 5,    8 from dual
  7   union all select 6,    3 from dual
  8  );
 
Table created
SQL> var qnty number
SQL> exec :qnty := 8;
 
PL/SQL procedure successfully completed
qnty
---------
8
SQL> merge into test t
  2    using ( select id,case when rsm + value > :qnty then value-:qnty+rsm else 0 end nval
  3             from (
  4               select id
  5                      ,value
  6                      ,-value + sum(value) over (order by value,id)  rsm
  7                from test
  8             )
  9            where rsm <= :qnty
 10           ) s
 11    on (t.id = s.id)
 12    when matched then update set value = nval;
 
Done
qnty
---------
8
SQL> select * from test;
 
        ID      VALUE
---------- ----------
         1          0
         2          4
         3          7
         4          8
         5          8
         6          0
 
6 rows selected


Добавлено через 9 минут
Блин, SQL Server 2005 smile Он не умеет считать накаппливающую сумму

Платформу сразу не увидел. Вернее в первый раз увидел, отвечать не стал, во второй раз не узрел, дал бесползеный ответ ((((

Это сообщение отредактировал(а) Zloxa - 4.8.2011, 10:30


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.0437 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.