Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / HELP: Прикольная выборка / 2 сообщений из 2, страница 1 из 1
09.02.2004, 14:14
    #32402758
Brodyaga
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HELP: Прикольная выборка
У меня есть таблица:
Т1: номер (ключевое поле), накладная, вес
мне нужно выбрать из таблицы Т1 первые записи так что бы общий вес , выбраных записей был приближен к определеному числу
Т.Е. мне нужно выбрвть из таблицы Т1 записи что сума поля вес был приблизительно равен 5000 , к примеру, но небольше....
ответ пишите на мыло sergey@briz.mk.ua

P.S. Заранее благодарен
...
Рейтинг: 0 / 0
09.02.2004, 14:53
    #32402870
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HELP: Прикольная выборка
Вариант для ASA9:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
begin
  // Исходная таблица
  declare local temporary table #T1 (
    Num int not null primary key, 
    Nakl int not null, 
    Ves int not null,
  ) not transactional;

  // Результирующая таблица
  declare local temporary table #T2 (
    Num int not null primary key, 
    Nakl int not null, 
    Ves int not null,
  ) not transactional;

  // Раскидываемый вес
  declare @FullVes int;

  // Параметры записи
  declare @Num int;
  declare @Nakl int;
  declare @Ves int;

  // Заносим исходные данные
  insert into #T1 (Num, Nakl, Ves)
    select  1 ,  1001 ,  1000 
    union all
    select  2 ,  2002 ,  1500 
    union all
    select  3 ,  3003 ,  500 
    union all
    select  4 ,  4004 ,  1500 
    union all
    select  5 ,  5005 ,  2500 ;

  // Устанавливаем нужный для раскидки вес
  set @FullVes =  5000 ;

  // Организуем цикл поиска максимально приближенного веса
  // по исходным данным
  lVes:
  while @FullVes >  0  loop
    // Получаем запись
    select top  1  Num, Nakl, Ves
    into @Num, @Nakl, @Ves
    from #T1
    where Ves <= @FullVes and
          Num not in (select Num from #T2)
    order by Ves desc;

    // Выходим, если больше ничего не найдено
    if @@RowCount =  0  then
      leave lVes;
    end if;

    // Переносим запись
    insert into #T2 (Num, Nakl, Ves)
    values (@Num, @Nakl, @Ves);

    // Отнимаем от общего веса занесенное значение
    set @FullVes = @FullVes - @Ves;
  end loop;

  // Выводим результирующую таблицу
  select *
  from #T2;

  // Показываем, сколько веса осталось не дораскиданным
  select @FullVes;
end
...
Рейтинг: 0 / 0
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / HELP: Прикольная выборка / 2 сообщений из 2, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]