Добрый день.
Есть задача SQL запросом выбрать товары определенной категории с сортировкой по цене.
казалось бы что то типа
select * from TOVAR_NAME order by CERA_R DESC
- но это работает неправильно, так как товары в таблице могут быть в разных валютах.
Есть ли какое-то тривиальное решение этого вопроса?
типа select * from TOVAR_NAME order by (CERA_R * КУРС(CENA_OUT_CURR_ID)) DESC
В чем именно проблема в сортировке по expression, а не по полю? В Firebird это работает без проблем:
SELECT
tn.*
FROM
tovar_name tn
ORDER BY
(tn.cena_r * 25.2) DESC
Или отображением поля в нац валюте? Вот пример:
SELECT
t.*,
CASE
WHEN (t.cena_out_curr_id = :nac_val_id) THEN t.cena_r
WHEN (c.how_to_calc = 0 AND c_out.how_to_calc = 1) THEN t.cena_r/c.kurs/c_out.kurs
WHEN (c.how_to_calc = 1 AND c_out.how_to_calc = 1) THEN t.cena_r*c.kurs/c_out.kurs
WHEN (c.how_to_calc = 0 AND c_out.how_to_calc = 0) THEN t.cena_r/c.kurs*c_out.kurs
WHEN (c.how_to_calc = 1 AND c_out.how_to_calc = 0) THEN t.cena_r*c.kurs*c_out.kurs
END AS nac_cena_r
FROM
tovar_name t
JOIN currency c ON c.num = :nac_val_id
JOIN currency c_out ON c_out.num = t.cena_out_curr_id
ORDER BY
nac_cena_r
Вроде так :) В 2.5 можно и alias указывать в сортировке, как в примере выше. :nac_val_id - это ID нац валюты. Пример для розничной расходной цены, для приходной вместо cena_out_curr_id используется cena_curr_id. Подобный расчет можно посмотреть в SQL скрипте отчета "Прайс-лист".
Вот хороший мануал по Firebird 2.5 на русском:
http://www.firebirdsql.org/file/documentation/reference_manuals/Firebird-Language-Reference-Russian.pdf (http://www.firebirdsql.org/file/documentation/reference_manuals/Firebird-Language-Reference-Russian.pdf)
О ДА!
Очень интересная конструкция :)
Как то в других БД я не натыкался на условия подстановки полей в зависимости от значения других полей :)
Спасибо. Вроде работает. Осталось только еще внести туда понятия скидок :)