Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.08.21;
Скачать: CL | DM;

Вниз

Интересный запрос с группировкой   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.041 c
11-1105566860
koller
2005-01-13 00:54
2005.08.21
FormatFloat


1-1122724239
Antonn
2005-07-30 15:50
2005.08.21
Ресурсы в EXE шнике


14-1122941411
k2
2005-08-02 04:10
2005.08.21
Imagine Cup 2005


1-1122616300
Shlomo
2005-07-29 09:51
2005.08.21
QuickReport, внедрить один отчёт в другой?


14-1122063364
Vlad Oshin
2005-07-23 00:16
2005.08.21
Задача по физике.