Помогите написать запрос
От: Аноним  
Дата: 16.07.03 07:52
Оценка:
Есть такая табличка

 (пример)

Поле1 | Сумма
-------------
  a        1
  a        2
  b        3
  c        2  
  a        2  
  b        3  
  b        3


Нужно сделать запрос для отчета такого вида
a | Итого по a | доля a
b | Итого по b | доля b
c | Итого по с | доля с


доля x = (Итого по x)/(Итого по всем)

Пробовал писать



select max(Поле1), sum(Cумма), sum(Cумма)/sum(sum(Cумма)) from ...
group by поле1


Oracle выдаeт ошибки на первых двух поля типа NOT GROUP BY EXPRESSION

Помогите написать запрос.
Заранее спасибо
Re: Помогите написать запрос
От: Dimka Россия  
Дата: 16.07.03 08:28
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть такая табличка


А>select max(Поле1), sum(Cумма), sum(Cумма)/sum(sum(Cумма)) from ...

А>group by поле1

гммм.. ну и запросик !!! sum(Cумма)/sum(sum(Cумма)) — вот это клёво !!!
А>Oracle выдаeт ошибки на первых двух поля типа NOT GROUP BY EXPRESSION
А>Помогите написать запрос.
А>Заранее спасибо

в один селект у меня не получилось да и кажется это будет очень не оптимально.
зато можно сначала посчитать общую сумму и потом простенький Select

select Поле1 ,sum (Cумма), to_char (sum (Cумма) / доля x )
    from ...
  group by Поле1
  order by Поле1

тут доля х — это результат предыдущего селекта.
- нельзя впихать невпихуемое :)
Re: Помогите написать запрос
От: yogi Россия  
Дата: 16.07.03 08:30
Оценка: 3 (1)
Здравствуйте, Аноним, Вы писали:

А>Есть такая табличка

А>
 (пример)
А>Поле1 | Сумма
А>

А>Нужно сделать запрос для отчета такого вида
А>
А>a | Итого по a | доля a
А>b | Итого по b | доля b
А>c | Итого по с | доля с
А>


Вот те вариантик:
select
  Поле1,
  sum(Cумма),
  sum(Cумма/(select sum(Cумма) from tablename))
from tablename
group by Поле1
Путь к сердцу женщины лежать не должен.
Re[2]: Помогите написать запрос
От: Dimka Россия  
Дата: 16.07.03 08:31
Оценка:
Здравствуйте, Dimka, Вы писали:

D>тут доля х — это результат предыдущего селекта.

"доля х" — читай "Итого по всем"
- нельзя впихать невпихуемое :)
Re: Помогите написать запрос
От: KGP http://kornilow.newmail.ru
Дата: 16.07.03 08:53
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Нужно сделать запрос для отчета такого вида

А>
А>a | Итого по a | доля a
А>b | Итого по b | доля b
А>c | Итого по с | доля с
А>


А>доля x = (Итого по x)/(Итого по всем)

А>Пробовал писать
А>
А>select max(Поле1), sum(Cумма), sum(Cумма)/sum(sum(Cумма)) from ...
А>group by поле1
А>


А>Oracle выдаeт ошибки на первых двух поля типа NOT GROUP BY EXPRESSION


А>Помогите написать запрос.

А>Заранее спасибо

1) max(Поле1) — что это и зачем ? может просто Поле1
2) sum(Cумма) — что это и зачем ? может просто sum(Поле1)
или я туплю или ...
Re[2]: Помогите написать запрос
От: Аноним  
Дата: 16.07.03 08:56
Оценка:
Здравствуйте, yogi, Вы писали:


Y>Вот те вариантик:

Y>
Y>select
Y>  Поле1,
Y>  sum(Cумма),
Y>  sum(Cумма/(select sum(Cумма) from tablename))
Y>from tablename
Y>group by Поле1
Y>


А сколько раз при этом реально будет выполняться


select sum(Cумма) from tablename


(если конкретно рассматривать Oracle)
???
Re[2]: Помогите написать запрос
От: Аноним  
Дата: 16.07.03 09:00
Оценка:
Здравствуйте, KGP, Вы писали:

KGP>Здравствуйте, Аноним, Вы писали:



KGP>1) max(Поле1) — что это и зачем ? может просто Поле1

KGP>2) sum(Cумма) — что это и зачем ? может просто sum(Поле1)
KGP>или я туплю или ...

В примере я привел упращенный вариант на самом деле в поле1 храняться некоторые коды групп
а названия групп в другой таблице
приходиться писать вместо поле1 что-то max(другая_таблица.название_группы)

Буду рад увидеть варианты оптимизации на этот счет может last и т.п.
Re[2]: Помогите написать запрос
От: KGP http://kornilow.newmail.ru
Дата: 16.07.03 09:00
Оценка:
Здравствуйте, KGP, Вы писали:

KGP>Здравствуйте, Аноним, Вы писали:


А>>Нужно сделать запрос для отчета такого вида

А>>
А>>a | Итого по a | доля a
А>>b | Итого по b | доля b
А>>c | Итого по с | доля с
А>>


А>>доля x = (Итого по x)/(Итого по всем)

А>>Пробовал писать
А>>
А>>select max(Поле1), sum(Cумма), sum(Cумма)/sum(sum(Cумма)) from ...
А>>group by поле1
А>>


А>>Oracle выдаeт ошибки на первых двух поля типа NOT GROUP BY EXPRESSION


А>>Помогите написать запрос.

А>>Заранее спасибо

KGP>1) max(Поле1) — что это и зачем ? может просто Поле1

KGP>2) sum(Cумма) — что это и зачем ? может просто sum(Поле1)
KGP>или я туплю или ...

про 2) снимаю ...
select Поле1, sum(Cумма), sum(Cумма)/(select sum(Cумма) from Table1) from Table1
group by Поле1, order by Поле1

а вот c select sum(Cумма) from Table1 пройдет ?
Re: Помогите написать запрос
От: Аноним  
Дата: 16.07.03 09:06
Оценка:
Подобные штучки типа процента от общего объема, дисперсия и т.п часто можно сделать встроенными средствами репорт-генераторов (в Access, Oracle Reports, Crystal Reports и т.д.)

Эти генераторы строят хитрые запросы или осуществляется дополнительная обработка на стороне клиента?
Re[3]: Помогите написать запрос
От: yogi Россия  
Дата: 16.07.03 09:19
Оценка:
Здравствуйте, Аноним, Вы писали:

А>А сколько раз при этом реально будет выполняться

А>
А>select sum(Cумма) from tablename
А>

А>(если конкретно рассматривать Oracle)
Думаю Оракл догадается не делать это больше одного раза.
Путь к сердцу женщины лежать не должен.
Re[2]: Помогите написать запрос
От: Dimka Россия  
Дата: 16.07.03 09:28
Оценка:
Здравствуйте, yogi, Вы писали:


Y>Вот те вариантик:

Y>
Y>select
Y>  Поле1,
Y>  sum(Cумма),
Y>  sum(Cумма/(select sum(Cумма) from tablename))
Y>from tablename
Y>group by Поле1
Y>



а у меня такая конструкция в Oracle не работает
- нельзя впихать невпихуемое :)
Re[3]: Помогите написать запрос
От: yogi Россия  
Дата: 16.07.03 09:40
Оценка: :))
Здравствуйте, Dimka, Вы писали:

D>а у меня такая конструкция в Oracle не работает

За $100 я приеду к вам в офис (по Москве) и сделаю чтоб работала
Путь к сердцу женщины лежать не должен.
Re[4]: Помогите написать запрос
От: Dimka Россия  
Дата: 16.07.03 09:44
Оценка:
Здравствуйте, yogi, Вы писали:

Y>Здравствуйте, Dimka, Вы писали:


Y>За $100 я приеду к вам в офис (по Москве) и сделаю чтоб работала

гмм... спасибо конечно...

может удалённо разберёмся

select
Поле1,
sum(Cумма),
sum(Cумма/(select [ВОТ ТУТ]sum(Cумма) from tablename))
from tablename
group by Поле1

пишет not a GROUP BY expression

а то задумка мне понравилаь
- нельзя впихать невпихуемое :)
Re[5]: Помогите написать запрос
От: yogi Россия  
Дата: 16.07.03 09:52
Оценка:
Здравствуйте, Dimka, Вы писали:

D>select

D>Поле1,
D>sum(Cумма),
D>sum(Cумма/(select [ВОТ ТУТ]sum(Cумма) from tablename))
D>from tablename
D>group by Поле1
D>пишет not a GROUP BY expression
D>а то задумка мне понравилаь

Задумки у меня вообще, откровенно говоря, гениальные Можь ты там где скобочки забыл? Я вот сейчас проверил — все пахает как надо.
Путь к сердцу женщины лежать не должен.
Re: Помогите написать запрос
От: stejko  
Дата: 16.07.03 14:06
Оценка: 4 (1)
Здравствуйте, Аноним, Вы писали:

А>Нужно сделать запрос для отчета такого вида

А>[sql]
А>a | Итого по a | доля a
А>b | Итого по b | доля b
А>c | Итого по с | доля с

А>доля x = (Итого по x)/(Итого по всем)



В Oracle для этих целей можно использовать аналитические функции.


select distinct a 
,sum(b ) over (partition by a) sum
,sum(b ) over () sum_sum
,round(sum(b ) over (partition by a)/sum(b ) over (),2)*100 prozent
from table
Re[2]: Помогите написать запрос
От: Antidote  
Дата: 17.07.03 09:58
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Подобные штучки типа процента от общего объема, дисперсия и т.п часто можно сделать встроенными средствами репорт-генераторов (в Access, Oracle Reports, Crystal Reports и т.д.)


А>Эти генераторы строят хитрые запросы или осуществляется дополнительная обработка на стороне клиента?


в Crystal Reports точно нет хитрых запросов) (по крайней мере в седьмой версии)
всё на стороне клиента
Чему бы грабли ни учили, а сердце верит в чудеса.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.