Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
tinimi
Зарегистрирован: 27.03.2005 Сообщения: 90 Откуда: Win32
|
Добавлено: Сб Ноя 12 2005 13:59 Заголовок сообщения: SQL задачка. |
|
|
Вот. Я в SQL ноль. но нада решить такую задачу:
есть таблица типа:
50
30
47
3
Ну короче числа просто.
И дано число, например 86.
Надо из таблици начиная сверху извлечь елементов на ету сумму.
Тоесть будет:
41
3
Вот. Как на с++ или еще чем сделать знаю, но нада на sql. Помогите плиз. _________________ [ TiNiMi ] |
|
Вернуться к началу |
|
|
Princess
Зарегистрирован: 05.10.2005 Сообщения: 48
|
Добавлено: Пн Ноя 14 2005 12:34 Заголовок сообщения: |
|
|
Хотела бы помощь, но не поняла вопроса? Т.е. что конкретно должно быть на сумму? какая БД (Oracle? MSSQL? ...???) |
|
Вернуться к началу |
|
|
tinimi
Зарегистрирован: 27.03.2005 Сообщения: 90 Откуда: Win32
|
Добавлено: Пн Ноя 14 2005 21:44 Заголовок сообщения: |
|
|
Нет, без привязки к БД. На ANSI SQL.
надо выбрать начиная с начала числа на ету сумму.
Грубо говоря - есть склад, в нем - комнаты.
Числа - ето количество ящиков товара в каждой комнате.
Надо Забрать N ящиков, и вывести что останется, при етом забираем по порядку.
Тоесть было:
10 15 7 3 12 47
Забрали 27 и получили
0 0 5 3 12 47
тоесть забрали соответственно 10+15+2=27.
Надо брать с начала. ну по вышеописаному принципу. _________________ [ TiNiMi ] |
|
Вернуться к началу |
|
|
Princess
Зарегистрирован: 05.10.2005 Сообщения: 48
|
Добавлено: Вт Ноя 15 2005 09:24 Заголовок сообщения: |
|
|
Проблема собственно в том, что в БД строки могут находится в другом порядке. Строки хранятся неупорядоченно.
-> необходимо сначало упорядочить их по какому-то признаку (полю). На сколько я вижу, в твоем случае скорее всего есть поле ID.
-> упорядочиваем по нему : order by ID
А вот дальше уже надо подумать, как это по-красивше сделать.
Про БД я спросила, т.к. SQL может быть разным внутри. ANSI SQL, PL/SQL.. |
|
Вернуться к началу |
|
|
tinimi
Зарегистрирован: 27.03.2005 Сообщения: 90 Откуда: Win32
|
Добавлено: Вт Ноя 15 2005 12:59 Заголовок сообщения: |
|
|
БД: ANSI SQL
Упорядочивать никак не надо, вернее есть автоинкремен поле, и соответственно. Порядок не менять. _________________ [ TiNiMi ] |
|
Вернуться к началу |
|
|
Princess
Зарегистрирован: 05.10.2005 Сообщения: 48
|
Добавлено: Вт Ноя 15 2005 14:47 Заголовок сообщения: |
|
|
Упорядочить надо по-любому, т.к. откуда SQL знает, где начало вашей таблицы?
Решать эту задачку предлагаю обсуждая, т.к. ответа я пока не знаю. Есть только идеи: хранимые процедуры, UDF-функции, курсор, может их сочетание.
У вас есть 2 переменные:
1 - сумма s;
2 - поле n.
Тогда:
if s>n then s = s-n; n = 0
else s = 0; n = n-s;
Так должна происходить обработка.
Дальше можно с помощью курсора пробежать по таблице, заменяя необходимые поля.
Справитесь? Или код написать? Сейчас я, кажется, уже знаю как. |
|
Вернуться к началу |
|
|
Princess
Зарегистрирован: 05.10.2005 Сообщения: 48
|
Добавлено: Вт Ноя 15 2005 15:00 Заголовок сообщения: |
|
|
DECLARE @n numeric(18,2)
DECLARE @id INT
DECLARE @s numeric(18,2)
DECLARE CURSOR_TYPE CURSOR FOR SELECT t.id, t.n FROM t order by id asc
OPEN CURSOR_TYPE
FETCH NEXT FROM CURSOR_TYPE INTO @id,@n
SELECT @s = 345 --это к примеру
If @s > 0 then begin
If @s>@n then
begin
@s = @s - @n
@n = 0
end
else
begin
@n = @n - @s
@s = 0
end
end
UPDATE t SET t.id=@id, t.n = @n WHERE t.id = @id
WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM CURSOR_TYPE INTO @id,@n
If @s > 0 then begin
If @s>@n then
begin
@s = @s - @n
@n = 0
end
else
begin
@n = @n - @s
@s = 0
end
end
UPDATE t SET t.id=@id, t.n = @n WHERE t.id = @id
END
CLOSE CURSOR_TYPE
DEALLOCATE CURSOR_TYPE
Это пока единственное. что приходит в голову. Могут быть ошибки, т.к. на практике я не проверяла.
Данный текст можно оформить внутри хранимой процедуры или UDF-функции, чтобы передать параметр @s внутрь. |
|
Вернуться к началу |
|
|
tinimi
Зарегистрирован: 27.03.2005 Сообщения: 90 Откуда: Win32
|
Добавлено: Вт Ноя 15 2005 17:35 Заголовок сообщения: |
|
|
Да, ты, наверрно =), правильно поняла.
Пояснения. БД. Например qwe. =)
В ней одна таблица(покрайней мере мы работаем только с одной)
Вот она:
В ней два столбца.
ID - autoincrement - primary index
asd - number - Сдесь и хранятся наши данные.
А в SQL - я ноль.
Может посоветуеш что нить в електронном варианте?
mail: tinimi<at>gmail<dot>com _________________ [ TiNiMi ] |
|
Вернуться к началу |
|
|
Princess
Зарегистрирован: 05.10.2005 Сообщения: 48
|
Добавлено: Вт Ноя 15 2005 17:56 Заголовок сообщения: |
|
|
http://www.firststeps.ru/
Довольно наглядно. Только это применительно к SQLServer.
Но в нем как раз ANSI SQL.
Основы можете посмотреть там. |
|
Вернуться к началу |
|
|
tinimi
Зарегистрирован: 27.03.2005 Сообщения: 90 Откуда: Win32
|
Добавлено: Ср Ноя 16 2005 14:36 Заголовок сообщения: |
|
|
Спасибо. Может еще что по MySQL подскажеш? _________________ [ TiNiMi ] |
|
Вернуться к началу |
|
|
Princess
Зарегистрирован: 05.10.2005 Сообщения: 48
|
Добавлено: Чт Ноя 17 2005 15:37 Заголовок сообщения: |
|
|
К сожалению, с MySQL не работала и поэтому никаких ссылочек не знаю. Но если порыскать в инете - наверняка найдете |
|
Вернуться к началу |
|
|
|