Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.029 c
14-1122913353
Kerk
2005-08-01 20:22
2005.08.21
Хотел запустить IRC-бота у себя на хостинге...


3-1121233889
yk
2005-07-13 09:51
2005.08.21
Как добавить символ перевода строки


5-1093544503
Gero
2004-08-26 22:21
2005.08.21
Наследник TImageList


1-1123066555
Гость22
2005-08-03 14:55
2005.08.21
Как слелать текст на форме мигающим?


14-1122567143
Ego
2005-07-28 20:12
2005.08.21
Творческий кризис.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский