Форум: "Базы";
Текущий архив: 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: дело в том, что вопервых создавать я ничего не могу - права только на чтение (так-что хранимые процедуры тоже не подходят), а во вторых запрос должен выполняться на "рабочей" базе, я имею в виду, что она очень большая и суммирование по всем диапазонам мягко говоря не удовлетворяет требованиям ко времени - проще выполнить подряд все необходимые запросы.
Кто знает реальные ограничения на размер запроса для указанных выше СУБД?
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.02.11;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.004 c