Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 запросик  [new]
Motorin Sergey
Member

Откуда:
Сообщений: 68
Привет всем. Помогите плз, никак не могу сообразить..
Есть таблица (прототип, в реальности в ней 20 полей и 6889090 записей)
field1 field2 field3 field4
----------------------
Окно 1 1 0
Окно 4 6 2
Окно 2 4 1
Рама 2 6 1
Рама 3 4 2

нужно написать запрос который группировал бы эту таблицу по FIELD1, выводил бы сумму по FIELD2 и выводил бы среднее от частного FIELD4/FIELD3 не учитывая строки с FIELD4=0, то есть результат запроса должен быть таким:

NAME SUM(FIELD2) AVG(FIELD3/FIELD4)
Окно 7 3
Рама 5 4

это одним запросом надо сделать..

Спасибо..
21 июн 07, 11:26    [4298036]     Ответить | Цитировать Сообщить модератору
 Re: запросик  [new]
Virtuoz
Member

Откуда: Украина
Сообщений: 307
Используй подзапрос.
21 июн 07, 11:28    [4298047]     Ответить | Цитировать Сообщить модератору
 Re: запросик  [new]
Motorin Sergey
Member

Откуда:
Сообщений: 68
Virtuoz
Используй подзапрос.

select t.field1, sum(t.field2), avg(t.field3/t.field4)
from table1 t
group by t.field1
подзапрос тоже не пойдет - это увеличивает время запроса в 2 раза
21 июн 07, 11:40    [4298132]     Ответить | Цитировать Сообщить модератору
 Re: запросик  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
Motorin Sergey
не учитывая строки с FIELD4=0
Здесь decode, все остальное как обычно
21 июн 07, 11:41    [4298144]     Ответить | Цитировать Сообщить модератору
 Re: запросик  [new]
Elic
Member

Откуда:
Сообщений: 29990
Motorin Sergey
среднее от частного FIELD4/FIELD3 не учитывая строки с FIELD4=0
avg(case when учитывая then частное end)
21 июн 07, 11:45    [4298182]     Ответить | Цитировать Сообщить модератору
 Re: запросик  [new]
Mikst
Member

Откуда: Москва
Сообщений: 983
нужно делать свою реализацию функции AVG
примерно так
select sum(decode(b,0,0,a/b)) / count(decode(b,0,null,1)) from
(select 1 a, 1 b from dual union all
select 2 a, 1 b from dual union all
select 3 a, 1 b from dual union all
select 500 a, 0 b from dual )

рез: 2
21 июн 07, 11:45    [4298186]     Ответить | Цитировать Сообщить модератору
 Re: запросик  [new]
Mikst
Member

Откуда: Москва
Сообщений: 983
Elic как всегда прав . AVG же не учитывает null значения

select avg(decode(b,0,null,a/b))   from
(select 1 a, 1 b from dual union all
select 2 a, 1 b from dual union all
select 3 a, 1 b from dual union all
select 500 a, 0 b from dual )
также 2.
21 июн 07, 11:47    [4298199]     Ответить | Цитировать Сообщить модератору
 Re: запросик  [new]
Motorin Sergey
Member

Откуда:
Сообщений: 68
Elic
avg(case when учитывая then частное end)

Спасибо, помогло!
21 июн 07, 11:59    [4298300]     Ответить | Цитировать Сообщить модератору
 Re: запросик  [new]
-MaD-
Member

Откуда:
Сообщений: 26
так тоже работает
select f1, sum(f2), avg(f3/decode(f4, 0, null, f4)) from 
(select 'Окно' f1, 1 f2, 1 f3, 0 f4 from dual union all
select 'Окно', 4, 6, 2 from dual union all
select 'Окно', 2, 4, 1 from dual union all
select 'Рама', 2, 6, 1 from dual union all
select 'Рама', 3, 4, 2 from dual) t
group by f1
21 июн 07, 12:05    [4298341]     Ответить | Цитировать Сообщить модератору
 Re: запросик  [new]
Elic
Member

Откуда:
Сообщений: 29990
-MaD-
/decode(..., ..., null, f4)
Два лишних преобразования типов :)
21 июн 07, 12:18    [4298444]     Ответить | Цитировать Сообщить модератору
 Re: запросик  [new]
Антигламур
Member

Откуда:
Сообщений: 7
или так ))
select
field1 s1,
sum(field2) over (partition by field1 order by field1) s2,
avg(field3/decode(field4, 0, null, field4)) over (partition by field1 order by field1) s3
from
(
select 'Окно' field1,1 field2,1 field3,0 field4 from dual union all
select 'Окно' field1,4 field2,6 field3,2 field4 from dual union all
select 'Окно' field1,2 field2,4 field3,1 field4 from dual union all
select 'Рама' field1,2 field2,6 field3,1 field4 from dual union all
select 'Рама' field1,3 field2,4 field3,2 field4 from dual
)
21 июн 07, 12:57    [4298750]     Ответить | Цитировать Сообщить модератору
 Re: запросик  [new]
Антигламур
Member

Откуда:
Сообщений: 7
сорри накалякал чо то не то...
select distinct
field1 s1,
sum(field2) over (partition by field1 order by field1) s2,
avg(field3/decode(field4, 0, null, field4)) over (partition by field1 order by field1) s3
from
(
select 'Окно' field1,1 field2,1 field3,0 field4 from dual union all
select 'Окно' field1,4 field2,6 field3,2 field4 from dual union all
select 'Окно' field1,2 field2,4 field3,1 field4 from dual union all
select 'Рама' field1,2 field2,6 field3,1 field4 from dual union all
select 'Рама' field1,3 field2,4 field3,2 field4 from dual
)
21 июн 07, 12:59    [4298768]     Ответить | Цитировать Сообщить модератору
 Re: запросик  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
Антигламур
select distinct
field1 s1,
sum(field2) over (partition by field1 order by field1) s2,
avg(field3/decode(field4, 0, null, field4)) over (partition by field1 order by field1) s3
Угу, а ещё можно иерархию прикрутить - до кучи :)
21 июн 07, 14:05    [4299250]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить