2014-01-21 3 views
2

У меня есть следующие данные в моей базе данных Oracle SQL:SQL среднего значения с модификаторами

VALUE CURRENCY 
143.88 PLN 
440  PLN 
21  USD 
210.46 PLN 
104.17 CHF 
324.5 USD 
198.84 PLN 

То, что я хочу сделать, это рассчитать среднее значение с учетом существует различные валюты. Какой самый простой способ сделать это?

Сейчас я создаю несколько столбцов со всеми желаемыми значениями, но у меня есть проблема с выбором правильного значения в соответствии с валютой в определенной строке.

SELECT VALUE,VALUE*3.08,VALUE*3.37,CURRENCY 
    FROM DATA_SAMPLE 
    WHERE VALUE IS NOT NULL 
+0

'выберите валюту, в среднем (значение) из таблицы группы по Currency' –

+0

Хорошо, но я не буду иметь одно значение. Может быть, я не понимаю, но я имел в виду одно среднее значение для целых данных. –

+2

@MateuszKowalski у вас должны быть отдельные таблицы, для конверсии и цены. Это легко ремонтируется. –

ответ

3

Позволяет нормализовать его, для удобства запросов. Есть 2 таблицы Say,

Price (CurrencyCode,Value) 

И

Currency_Conversion(CurrencyCode, CurrencyName,conversion_factor) 

Цена:

VALUE CURRENCYCODE 
143.88 PLN 
440  PLN 
21  USD 
210.46 PLN 
104.17 CHF 
324.5 USD 
198.84 PLN 

Currency_Conversion:

CURRENCYCODE CONVFACTOR 
PLN   3.08 
USD   1 
CHF   3.37 

Запрос:

SELECT CONV.CURRENCYCODE , AVG(PRICE.VALUE * CONV. CONVFACTOR) as VALUE 
FROM PRICE, CURRENCY_CONVERSION CONV 
WHERE 
    PRICE. CURRENCYCODE = CONV. CURRENCYCODE 
GROUP BY 
    CONV. CURRENCYCODE 
0

Я бы написал функцию, которая берет код валюты и возвращает текущий коэффициент конверсии. Затем я бы использовал эту функцию для нормализации значений - конвертировал их в одну валюту. Тогда я бы вычислил среднее значение.

Вид псевдо SQL (я не эксперт Oracle :))

CREATE FUNCTION FunctionConvertCurrency 
... 

SELECT AVG(VALUE*FunctionConvertCurrency(CURRENCY)) 
FROM DATA_SAMPLE 
0

Создать таблицу с ценами валют. Скажем, PRICES с колонками CURRENCY и PRICE. Затем выберите среднее значение:

SELECT avg(ds.value*p.price) FROM data_sample ds JOIN prices p ON ds.currency = p.currency WHERE ds.value is not null; 
1

Я бы с решением таблицы поиска, но если вы не можете сделать это, вот запрос, который может помочь вам.

SELECT 
    case 
    when currency = 'USD' then value*2.1 
    when currency = 'PLN' then value*[INSERT PLN CURRENCY HERE] 
    end 
FROM DATA_SAMPLE 
WHERE VALUE IS NOT NULL 
Смежные вопросы