Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Интересный запрос с группировкой [D7, IB6.x, MSSQL, MySQL, Paradox, SybASE]


Страницы:   1 2

Russko ©   (2005-07-09 14:09:00) 

Есть такой запрос:
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 запроса, если это возможно.


}{ander   (2005-07-10 11:23:00) [1]

having (dogovor="389")
Очень странный having...
Ты лопатишь всю таблицу со всякими суммами и произведениями, а уже после этого выбираешь одну (две, три ... пять) нужную запись :-(
Что мешает вместо этого написать:
where (dogovor="389")
И, соответственно, индекс по полю dogovor. Будет летать :-)


P.N.P.   (2005-07-09 16:13:00) [2]

>Russko   (09.07.05 15:58) [20]
Это сюда:
http://www.ibase.ru/develop.htm
см. "Оптимизация запросов, производительность"


Russko   (2005-07-09 15:58:00) [3]

Во, создал простой индекс на поля dogovor и shifr и запрос проснулся, спасибо P.N.P. и Ольга.
Но тут вопрос - поскольку с индексами я новичок,то что плохого можно от них ожидать?


Russko   (2005-07-09 15:52:00) [4]

Даже если и обзаведусь - проблемы не решит ((


P.N.P.   (2005-07-09 15:51:00) [5]

>Russko   (09.07.05 15:50) [17]
Попробуй обзавестись, ибо полезно должно быть :)


Russko   (2005-07-09 15:50:00) [6]

Нет, индексами не обзавёлся за ненадобностью.


P.N.P.   (2005-07-09 15:48:00) [7]

Индексы-то есть по 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:43:00) [8]

Запсей около 1500, но я выполняю запрос на сервере с 2 Гб памяти ((


Ольга   (2005-07-09 15:42:00) [9]

А записей в таблице много? Внутренний запрос будет выполняться для каждой из них. Так что может запрос не виснет, а просто долго выполняется?


Russko   (2005-07-09 15:38:00) [10]

2P.N.P.
Зависания продолжаются (((


P.N.P.   (2005-07-09 15:36:00) [11]

>Russko   (09.07.05 15:33) [9]
Убрери group by m2.dogovor,m2.shifr having (m2.dogovor="389")
из вложенного запроса.


Russko   (2005-07-09 15:34:00) [12]

2Ольга
Ага именно вовложенный запрос во FROM, ругается на select.


P.N.P.   (2005-07-09 15:34:00) [13]

>Ольга   (09.07.05 15:32) [8]
select from select тоже не поддерживается в текущих версиях.


Russko   (2005-07-09 15:33:00) [14]

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")


Ольга   (2005-07-09 15:32:00) [15]

Да здесь особых фокусов-то нет. А что не позволяет делать в FireBird, вложенный запрос во FROM?


P.N.P.   (2005-07-09 15:31:00) [16]

Текст запроса покажи.


Russko   (2005-07-09 15:27:00) [17]

А я к сожалению использую FireBird (( и на нём такой фокус не проходит((


Ольга   (2005-07-09 15:21:00) [18]

Для 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:17:00) [19]

Спасибо большое.
Угадал верно - использую FB, но данный запрос начинает выполняться (не ругается на ошибки в скрипте) и никак не закончится ((( - виснет.


P.N.P.   (2005-07-09 14:59:00) [20]

Движок-то какой из перечисленных?
В 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
писал от руки, не проверяя так что...


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо