Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
4-32370
AlexandrH_
2001-12-14 11:41
2002.02.11
Как можно считать текст из ячейки Grid_а чужого окна


14-32316
Гриф
2001-12-19 10:22
2002.02.11
Возраст призывника


3-32180
dim-
2002-01-14 14:40
2002.02.11
Вопрос по MSSql


6-32304
vvr
2001-11-21 14:11
2002.02.11
сети


7-32351
Иван Шихалев
2001-11-02 20:57
2002.02.11
Перезагрузка из DOS





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский