Форум: "Базы";
Текущий архив: 2005.08.21;
Скачать: [xml.tar.bz2];
ВнизИнтересный запрос с группировкой Найти похожие ветки
← →
Russko (2005-07-09 14:09) [0]Есть такой запрос:
select dogovor,shifr,sum(t_PZ+T_SHT*NUM*NUM_DOG) from main_base
group by dogovor,shifr having (dogovor="389")
Всё бы хорошо, но в произведении стоит поле NUM, мне необходимо, чтобы числа в этом поле тоже были просуммированы аналогичной группировкой, т.е. что-то типа:select dogovor,shifr,sum(NUM) from main_base
group by dogovor,shifr having (dogovor="389")
а уже потом полученные обновленные значения NUM использоватлись в первом запросе.
Помогите мне объединить эти 2 запроса, если это возможно.
← →
P.N.P. © (2005-07-09 14:14) [1]select dogovor,shifr,sum(NUM),sum(t_PZ+T_SHT*NUM*NUM_DOG) from main_base
group by dogovor,shifr having (dogovor="389")
← →
Russko (2005-07-09 14:25) [2]=))
Так это понятно, но мне надо, чтобы SUM(NUM) участвовал в произведении.
← →
P.N.P. © (2005-07-09 14:59) [3]Движок-то какой из перечисленных?
В FB например вложенные аггрегатные ф-ции запрещены,
извращаться можно или с пом. хп или вложенным запросом:select dogovor,shifr,sum(t_PZ+T_SHT*
(
select sum(m2.NUM) from main_base m2
where m2.dogovor = m1.dogovor and m2.shifr = m1.shifr
group by m2.dogovor,m2.shifr having (m2.dogovor="389")
)
*NUM_DOG) from main_base m1
group by 1,2 having (dogovor="389")
ps
писал от руки, не проверяя так что...
← →
Russko (2005-07-09 15:17) [4]Спасибо большое.
Угадал верно - использую FB, но данный запрос начинает выполняться (не ругается на ошибки в скрипте) и никак не закончится ((( - виснет.
← →
Ольга (2005-07-09 15:21) [5]Для MSSQL это будет так:
select a.dogovor,a.shifr,sum(t_PZ+T_SHT*b.NUM*NUM_DOG)
from main_base a,
(select dogovor,shifr,sum(NUM) as NUM
from main_base
group by dogovor,shifr
having (dogovor="389")
) b
where a.dogovor=b.dogovor and a.shifr=b.shifr
group by a.dogovor, a.shifr
having (dogovor="389")
← →
Russko (2005-07-09 15:27) [6]А я к сожалению использую FireBird (( и на нём такой фокус не проходит((
← →
P.N.P. © (2005-07-09 15:31) [7]Текст запроса покажи.
← →
Ольга (2005-07-09 15:32) [8]Да здесь особых фокусов-то нет. А что не позволяет делать в FireBird, вложенный запрос во FROM?
← →
Russko (2005-07-09 15:33) [9]
select m1.dogovor,m1.shifr,sum(m1.t_PZ+m1.T_SHT*(
select sum(m2.NUM) from main_base m2 where (m2.dogovor = m1.dogovor) and (m2.shifr = m1.shifr)
group by m2.dogovor,m2.shifr having (m2.dogovor="389")
)*m1.NUM_DOG) from main_base m1 group by m1.dogovor,m1.shifr having (m1.dogovor="389")
← →
P.N.P. © (2005-07-09 15:34) [10]>Ольга (09.07.05 15:32) [8]
select from select тоже не поддерживается в текущих версиях.
← →
Russko (2005-07-09 15:34) [11]2Ольга
Ага именно вовложенный запрос во FROM, ругается на select.
← →
P.N.P. © (2005-07-09 15:36) [12]>Russko (09.07.05 15:33) [9]
Убрери group by m2.dogovor,m2.shifr having (m2.dogovor="389")
из вложенного запроса.
← →
Russko (2005-07-09 15:38) [13]2P.N.P.
Зависания продолжаются (((
← →
Ольга (2005-07-09 15:42) [14]А записей в таблице много? Внутренний запрос будет выполняться для каждой из них. Так что может запрос не виснет, а просто долго выполняется?
← →
Russko (2005-07-09 15:43) [15]Запсей около 1500, но я выполняю запрос на сервере с 2 Гб памяти ((
← →
P.N.P. © (2005-07-09 15:48) [16]Индексы-то есть по dogovor,shifr?
Вот, к примеру, планы запроса (11680 records)
select e.name,sum(e.id),sum(e.id*4*
(select sum(ee.id) from mkb ee where ee.name=e.name))
from mkb e
group by 1
С индексом:
План
PLAN (EE INDEX (MKB_IDX1))
PLAN (E ORDER MKB_IDX1)
Адаптированный план
PLAN (EE INDEX (MKB_IDX1)) PLAN (E ORDER MKB_IDX1)
------ Performance info ------
Prepare time = 0ms
Execute time = 0ms
Avg fetch time = 0,00 ms
Current memory = 1 137 592
Max memory = 1 265 720
Memory buffers = 3 000
Reads from disk to cache = 0
Writes from cache to disk = 0
Fetches from cache = 2 395
Без индекса:
План
PLAN (EE NATURAL)
PLAN SORT ((E NATURAL))
Адаптированный план
PLAN (EE NATURAL) PLAN SORT ((E NATURAL))
------ Performance info ------
Prepare time = 0ms
Execute time = 2s 688ms
Avg fetch time = 206,77 ms
Current memory = 1 129 272
Max memory = 1 265 720
Memory buffers = 3 000
Reads from disk to cache = 0
Writes from cache to disk = 0
Fetches from cache = 3 458 738
← →
Russko (2005-07-09 15:50) [17]Нет, индексами не обзавёлся за ненадобностью.
← →
P.N.P. © (2005-07-09 15:51) [18]>Russko (09.07.05 15:50) [17]
Попробуй обзавестись, ибо полезно должно быть :)
← →
Russko (2005-07-09 15:52) [19]Даже если и обзаведусь - проблемы не решит ((
← →
Russko (2005-07-09 15:58) [20]Во, создал простой индекс на поля dogovor и shifr и запрос проснулся, спасибо P.N.P. и Ольга.
Но тут вопрос - поскольку с индексами я новичок,то что плохого можно от них ожидать?
← →
P.N.P. © (2005-07-09 16:13) [21]>Russko (09.07.05 15:58) [20]
Это сюда:
http://www.ibase.ru/develop.htm
см. "Оптимизация запросов, производительность"
← →
}{ander © (2005-07-10 11:23) [22]
having (dogovor="389")
Очень странный having...
Ты лопатишь всю таблицу со всякими суммами и произведениями, а уже после этого выбираешь одну (две, три ... пять) нужную запись :-(
Что мешает вместо этого написать:where (dogovor="389")
И, соответственно, индекс по полю dogovor. Будет летать :-)
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2005.08.21;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.066 c