Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.02.11;
Скачать: [xml.tar.bz2];




Вниз

Помогите с запросом 


Олег Лаукарт   (2002-01-15 12:35) [0]

Есть таблица с полями num : integer, val : integer.
Нужно выбрать все наборы сумм значений поля val для нескольких диапазонов num.
Т.е. есть диапазоны (буду указывать через двоеточие), которые возможно пересекающиеся - 10:100, 200:300, ... Нужно получить выборку сумм поля num по каждому из диапазонов в одном запросе.
Буду благодарен за помощь.



olban   (2002-01-15 13:00) [1]

Я очень сомневаюсь, что это можно сделать, если надо выбрать сразу эти данные можно применить объединенный запрос, типа
select sum(val) where num>100 and num<200
union all
select sum(val) where num>200 and num<300

и т.д.
А одним запросом невозможно



asafr   (2002-01-15 13:10) [2]


select sum(val) where num between 100 and 200
union
select sum(val) where num between 200 and 300
Что за СУБД?



Alexandr   (2002-01-15 13:11) [3]

или так для Interbase (а может и для других)
select
(select sum(val) where num>100 and num<200) sum1,
(select sum(val) where num>200 and num<300) sum2,
...
from rdb$database



Олег Лаукарт   (2002-01-15 13:17) [4]

Сложность в том что в исходной задаче диапазонов может быть довольно много - какие тогда могут вылезти проблемы? как много раз в одном запросе можно указывать union .
Другой вопрос в том, что насколько я знаю, каждая СУБД по разному оптимизирует запросы, но скорее всего запросы объединенные union будут выполнены за тоже время что и каждый из запросов в отдельности - а нужно какраз ускорить выборку. Какие будут предложения.



Олег Лаукарт   (2002-01-15 13:20) [5]

для asafr: Желательно чтобы запрос выполнялся на разных СУБД.



Alexandr   (2002-01-15 13:30) [6]

а чего там тогда ускорять.
Да еще и на разных субд.
А много диапазонов-это сколько?
все-таки привел бы хотябы на каких СУБД?
А так вообще разговор ниочем не получается.



Олег Лаукарт   (2002-01-15 13:47) [7]

Необходимо, чтобы запрос работал на таких СУБД: Oracle, Interbase, Informix, Sybase.

Диапазонов может быть от одного до пятисот.



Alexandr   (2002-01-15 13:52) [8]

тогда может хранимую процедуру можно?
а там пробежаться по всей таблице один раз и вручную смотреть, куда попадает num? туда и суммировать val.
Может получиться быстрее, хотя все зависит от сервера и от степени реализации там хранимых процедур, или как они там могут называться.
А общим решением для всех серверов будет как раз через union,
или как я писал.
И то, синтаксис будет слегка различаться...

Вот так вот



Олег Лаукарт   (2002-01-15 14:02) [9]

Спасибо.



asafr   (2002-01-15 14:04) [10]

Думаю, что если писать код, как

select sum(val) where num>100 and num<200
union
select sum(val) where num>200 and num<300
,
то этот синтаксис, думаю, должен подходить ко всем вышеперечисленным СУБД (я, к сожалению, не все их знаю, но больше чем уверен, что классический SQL подойдет любой из них). А количество UNION, если я не ошибаюсь, не ограничено каким либо количеством.
Еще бы интересно узнать, по каким критериям и принципу ты выбираешь диапазоны?



Alexandr   (2002-01-15 14:06) [11]

нет ограничение часто есть, может быть не на количество union, но на размер запроса точно.



Bachin   (2002-01-15 15:34) [12]

Сервер какой? Если MSSQL то можно так:

select a1, sum(a2)
from
(
select
case
when b1 < 100 then 1
when b1 < 200 then 2
when b3 < 500 then 3
end as a1,
b2 as a2
from b_table
)
group by a1

если много диапазонов - создавай блок case на клиенте



amamed_3071   (2002-01-15 16:03) [13]

select
sum(case num>=100 and num<200 then val esle 0 end) sum1,
sum(case num>=200 and num<300 then val esle 0 end) sum2
..
from table1
where num between 100 and 300




Vitaly   (2002-01-15 16:24) [14]

Я бы создал таблицу диапазонов:
t2:
индекс
нижняя граница
верхняя граница

select индекс, sum(val)
from t1, t2
where t1.num between нижняя граница and верхняя граница
group by индекс


Учти, если диапазоны пересекающиеся, то val просуммируется для всех диапазонов.



Олег Лаукарт   (2002-01-15 16:39) [15]

Перечень диапазонов определяется в runtime.

для Vitaly: дело в том, что вопервых создавать я ничего не могу - права только на чтение (так-что хранимые процедуры тоже не подходят), а во вторых запрос должен выполняться на "рабочей" базе, я имею в виду, что она очень большая и суммирование по всем диапазонам мягко говоря не удовлетворяет требованиям ко времени - проще выполнить подряд все необходимые запросы.

Кто знает реальные ограничения на размер запроса для указанных выше СУБД?




Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.02.11;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.74 MB
Время: 0.022 c
1-32218           Sergey Novoselow      2002-01-25 06:02  2002.02.11  
Как разложить выражение 200101 на 2001 и 01


1-32295           Lord BDV              2002-01-28 19:39  2002.02.11  
Отключение контекстного меню


3-32168           Yu                    2002-01-15 09:30  2002.02.11  
Как проверить корректность вводимых данных?


1-32234           Andger                2002-01-27 15:23  2002.02.11  
Delphi виснет при палитре > 16 цветов


4-32383           Olgerd                2001-12-09 18:19  2002.02.11  
Панель задач