Модераторы: Akella
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выбока среднего значения, Нужна помощь 
:(
    Опции темы
soloweb
Дата 6.12.2007, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Georgian
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 30.10.2006

Репутация: нет
Всего: нет



Имеется таблица 
(id price currency area)
 1  25     2            25
 2  100   1            30
 3  200   3            50

Надо получить средние значения цены и площади и при этом цены в базе лежать под currency (Тип валюты) 1- рубль 2-Доллары 3-Евро
Надо учесть корректную математику по полю price просто суммировать их нельзя дабы курсы валют разеые. Надо их к одной валюте привети и потом суммировать. Вот как это сделать.
Нужна помощь проффесионалов smile 
Да Сервер FireBird 1.5 smile 

Заранее благодарю. 
PM MAIL WWW ICQ   Вверх
Deniz
Дата 7.12.2007, 08:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 22
Всего: 44



Допустим переводим все в рубли
Пробуй, может поможет
Код

select t.id, avg(t.area), avg(
  case t.currency 
    when 2 then t.price*koefB 
-- здесь можно написать when 2 then price*(select ck.koef from curr_koef ck where ck.idcurr = t.currency)
    when 3 then t.price*koefE
    else t.price
  end
) from test t group by t.id
или можно проще
Код

select t.id, avg(t.price * ck.koef) 
from test t 
  inner join curr_koef ck on (ck.idcurr = t.currency) 
group by t.id

Можно еще прицепить выбор на дату


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Deniz
Дата 7.12.2007, 08:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 22
Всего: 44



Причем интересно, но ...
на 10000 записях и 3-х валютах скорость одинакова (разница на погрешности вычисления)


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
TaNK
Дата 7.12.2007, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 669
Регистрация: 29.10.2006
Где: Краснодар

Репутация: нет
Всего: 1



Код

select t.currency, 
         avg(t.area)as s_ar, avg(
               case t.currency
    when 1 then t.price*1--либо завести переменную
    when 2 then t.price*1
-- здесь можно написать when 2 then price*(select ck.koef from curr_koef ck where ck.idcurr = t.currency)
    when 3 then t.price*1
    else t.price
  end) as s_pr
  from test t group by t.currency


Добавлено через 3 минуты и 29 секунд
и еще Price and area  - должен быть  с плавающей точкой


--------------------

Oracle 11.2.0.3.0
FireBird 1.0-2.5


PM MAIL ICQ   Вверх
soloweb
Дата 9.12.2007, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Georgian
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 30.10.2006

Репутация: нет
Всего: нет



Разобрался ! Прокопался окнечно но все - же! Сделал так:
Создал процедуру приведения к одной валюте и потом сделал такой запрос
Код

select 
             avg((select result from val_conv(1, l.p_currency, '.$currencys->V_USD.', '.$currencys->V_EUR.', l.p_price))) as priceR,
             avg((select result from val_conv(2, l.p_currency, '.$currencys->V_USD.', '.$currencys->V_EUR.', l.p_price))) as priceD,
             avg((select result from val_conv(3, l.p_currency, '.$currencys->V_USD.', '.$currencys->V_EUR.', l.p_price))) as priceE ,
             count(*) as number, avg(p_area) area
             from table l


Всем откликнувшимся большое спасибо smile 

Это сообщение отредактировал(а) soloweb - 9.12.2007, 14:12
PM MAIL WWW ICQ   Вверх
TaNK
Дата 10.12.2007, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 669
Регистрация: 29.10.2006
Где: Краснодар

Репутация: нет
Всего: 1



так выложи процедуру, может кому нить в будущем понадобится!


--------------------

Oracle 11.2.0.3.0
FireBird 1.0-2.5


PM MAIL ICQ   Вверх
Deniz
Дата 10.12.2007, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 22
Всего: 44



TaNK, при наличии таблицы с ведением курса валют по датам, процедура перевода будет выглядеть из одного небольшого select'а.

Добавлено через 6 минут и 38 секунд
+ обычно среднее делается по чему-либо, т.е. стоимость 1-комн. квартиры, гаража, возможны доп.  разбивки на районы и т.д. 
в ответе автора выводится 3 средних значения непонятно чего, общее кол-во записей и среднее по площади, и все это без группировки.
Это почти как средняя температура по палате, у кого-то 35 у кого-то 39, в целом близко к норме.


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Interbase"
Alex

Обязательно указание:

1. Версию InterBase (Firebird, Yaffil)

2. Способа доступа (ADO, BDE, IBX и т.д.)

  • КАК ПРАВИЛЬНО ОФОРМИТЬ КОД - ЗДЕСЬ
  • КАК ПРАВИЛЬНО УКАЗАТЬ ТЕКСТ ОШИБКИ - ЗДЕСЬ
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • FAQ раздела лежит здесь!

Если Вам понравилась атмосфера форума, заходите к нам чаще! С Уважением, Akella.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Firebird, Interbase | Следующая тема »


 




[ Время генерации скрипта: 0.0444 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.